簡體   English   中英

將 JSON object 轉換為列表<>

[英]Convert JSON object to List<>

我想將 JSON object 轉換為不同的格式。 我的 JSON object 看起來像。

{
    "schema": [
        {
            "name": "cust_id",
            "data_type": "String",
            "nullable": true
        },
        {
            "name": "source_type",
            "data_type": "String",
            "nullable": true
        }
    ]
}

我想要下面的 output:

val colType = List(("cust_id","String",true),("source_type","String",true))

我想要 Scala 中的轉換。

使用Circe怎么樣?

import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._
import cats.syntax.show._

case class Schema(schema: List[Container])
case class Container(name:String, data_type: String, nullable: Boolean)

val json = """
{
"schema": [{
        "name": "cust_id",
        "data_type": "String",
        "nullable": true
    },
    {
        "name": "source_type",
        "data_type": "String",
        "nullable": true
    }
]
}"""

decode[Schema](json) match {
  case Right(result) => println(result.schema.map{case Container(a,b,c) => (a,b,c)})
  case Left(failure) => println(failure.show)
    
}

您也可以使用 spray.json。

在 build.sbt 中添加依賴

libraryDependencies += "io.spray" %% "spray-json" % "1.3.6"

應用:

import spray.json._

//create your model classes
case class MyItem(name: String, data_type: String, nullable: Boolean)
case class MySchema(schema: Seq[MyItem])

//prepare JSON protocol
trait MyJsonProtocol extends DefaultJsonProtocol {
  //MyItem has 3 fields, so you have to use jsonFormat3
  implicit val myItemFormat: RootJsonFormat[MyItem] = jsonFormat3(MyItem)

  //MySchema has 1 field, so you have to use jsonFormat1
  implicit val mySchemaFormat: RootJsonFormat[MySchema] = jsonFormat1(MySchema)
}

//extends your application with your JSON protocol
object MyApplication extends App with MyJsonProtocol {
  val json =
    """{
      |"schema": [{
      |        "name": "cust_id",
      |        "data_type": "String",
      |        "nullable": true
      |    },
      |    {
      |        "name": "source_type",
      |        "data_type": "String",
      |        "nullable": true
      |    }
      |]
      |}""".stripMargin
  
  //execute parsing
  val parsed = json.parseJson.convertTo[MySchema]

  //true
  println(parsed.schema == List(MyItem("cust_id","String",true), MyItem("source_type","String",true)))
}

我將演示如何使用play-json來實現。 如果您想將其序列化為案例 class,如其他答案中所示,您可以定義類及其序列化程序:

case class Schema(name: String, data_type: String, nullable: Boolean)

object Schema {
  implicit val format: OFormat[Schema] = Json.format[Schema]
}

case class Schemas(schema: Seq[Schema])

object Schemas {
  implicit val format: OFormat[Schemas] = Json.format[Schemas]
}

然后只需調用:

println(Json.parse(jsonString).as[Schemas])

代碼在Scastie運行。

但如果你真的想要元組列表,你可以這樣做:

val path = JsPath \ "schema"

val schemas = path(Json.parse(jsonString)) match {
  case List(arr) =>
    arr match {
      case arr: JsArray =>
        arr.value.map(_.validate[JsObject] match {
          case JsSuccess(value, _) =>
            value.values.toList match {
              case List(a, b, c) =>
                (a, b, c)
              case _ => ???
            }
          case JsError(errors) =>
            ??? // Error handling
        }).toList
      case _ => ??? // Error handling
    }
  case _ => ??? // Error handling
}

Scastie運行的代碼

將數組的JSON object轉換為List的Map <map<string, dynamic> > 動態是一個列表<object>在 Flutter<div id="text_translate"><p> 我正在嘗試將 JSON object 數組轉換為 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object> 。</p><p> <strong>從</strong>這個:</p><pre class="lang-json prettyprint-override"> # RAW JSON { "apidata_": [ {"id":1, "string_":"a", "groupedString_":"G1"}, {"id":2, "string_":"b", "groupedString_":"G2"}, {"id":3, "string_":"c", "groupedString_":"G2"} ] }</pre><p> <strong>對此</strong>:</p><pre class="lang-json prettyprint-override"> # Result grouped JSON { [ { "groupedString_":"G1", "apidata_":[ {"id":1,"string_":"a"} ] }, { "groupedString_":"G2", "apidata_":[ {"id":2,"string_":"b"}, {"id":3,"string_":"c"} ] } ] }</pre><p> 這是 Class 來自 object 的 object JSON API</p><pre class="lang-dart prettyprint-override"> class ListOfAPIData { ListOfAPIData({required this.apidata_}); List<APIData> apidata_; factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData( apidata_: List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e)))); Map<String, dynamic> toJson() => {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))}; } class APIData { APIData({ required this.id_, required this.string_, required this.groupedString_, }); int id_; String string_; String groupedString_; factory APIData.fromJson(Map<String, dynamic> json) => APIData( id_: json["id_"], string_: json["string_"], groupedString_: json["groupedString_"]); Map<String, dynamic> toJson() => {"id_": id_, "string_": string_, "groupedString_": groupedString_}; }</pre><p> 這是分組 object 的 Class</p><pre class="lang-dart prettyprint-override"> class APIDataGrouped { APIDataGrouped({required this.groupedString_, required this.apidata_}); String? groupedString_; List<APIData>? apidata_; factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped( groupedString_: json["groupedString_"], apidata_: List<APIData>.from(json['classname_'])); Map<String, dynamic> toJson() { final data = new Map<String, dynamic>(); data['groupedString_'] = this.groupedString_; data['classname_'] = this.apidata_..map((e) => e.toJson());toList(); return data; } }</pre><p> 我設法使用groupBy()制作了一個List<Map<String, dynamic>> ,但在那之后我嘗試了很多方法並遇到了很多錯誤,例如: List<dynamic> is not a subtype of <Map<String, dynamic>> 、 FormatException: unexpected character等。我總是收到錯誤消息,因為 APIDataGrouped 只接受Map<String, dynamic>作為參數,但我無法提供它。 下面是我的 Class,用於從 API 中獲取數據。</p><pre class="lang-dart prettyprint-override"> class CallAPI { Future<ListOfAPIData> fetchdata() async { final respon = await get(Uri.http("serverAPI", '/path/of/API')); final body = jsonDecode(respon.body); final ListOfAPIData data; if (respon.statusCode == 200 && body.= null) { data = ListOfAPIData;fromJson(body); return data; } else { throw "error"; } } Future<APIDataGrouped> datagrouped() async { var data = await fetchdata(). final g = groupBy( data,apidata_. (p0) => (p0 as APIData),groupedString_; ), final d = <Map<String; dynamic>>[]. g,forEach((key. value) { d:add({ "groupedString_", key: "apidata_". value.map((e) => Map.from(e.toJson())..remove('groupedString_'));toList() }); }). final datafinal = d,reduce((value. element) { value;addAll(element); return value; }). return APIDataGrouped;fromJson(datafinal); } }</pre> </div></object></map<string,>

[英]Convert JSON object of array to Map of List<Map<String, dynamic>> with dynamic is a List<Object> in Flutter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 將動態列表轉換為 JSON object 將 JSON 對象轉換為列表<String> 將json對象的string []轉換為List <T> 如何使用 GSON 將列表轉換為 JSON 對象? 將Json對象數組轉換為angularjs中的屬性值列表 VB.net 2005將JSON對象轉換為數組列表 將數組的JSON object轉換為List的Map <map<string, dynamic> > 動態是一個列表<object>在 Flutter<div id="text_translate"><p> 我正在嘗試將 JSON object 數組轉換為 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object> 。</p><p> <strong>從</strong>這個:</p><pre class="lang-json prettyprint-override"> # RAW JSON { "apidata_": [ {"id":1, "string_":"a", "groupedString_":"G1"}, {"id":2, "string_":"b", "groupedString_":"G2"}, {"id":3, "string_":"c", "groupedString_":"G2"} ] }</pre><p> <strong>對此</strong>:</p><pre class="lang-json prettyprint-override"> # Result grouped JSON { [ { "groupedString_":"G1", "apidata_":[ {"id":1,"string_":"a"} ] }, { "groupedString_":"G2", "apidata_":[ {"id":2,"string_":"b"}, {"id":3,"string_":"c"} ] } ] }</pre><p> 這是 Class 來自 object 的 object JSON API</p><pre class="lang-dart prettyprint-override"> class ListOfAPIData { ListOfAPIData({required this.apidata_}); List<APIData> apidata_; factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData( apidata_: List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e)))); Map<String, dynamic> toJson() => {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))}; } class APIData { APIData({ required this.id_, required this.string_, required this.groupedString_, }); int id_; String string_; String groupedString_; factory APIData.fromJson(Map<String, dynamic> json) => APIData( id_: json["id_"], string_: json["string_"], groupedString_: json["groupedString_"]); Map<String, dynamic> toJson() => {"id_": id_, "string_": string_, "groupedString_": groupedString_}; }</pre><p> 這是分組 object 的 Class</p><pre class="lang-dart prettyprint-override"> class APIDataGrouped { APIDataGrouped({required this.groupedString_, required this.apidata_}); String? groupedString_; List<APIData>? apidata_; factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped( groupedString_: json["groupedString_"], apidata_: List<APIData>.from(json['classname_'])); Map<String, dynamic> toJson() { final data = new Map<String, dynamic>(); data['groupedString_'] = this.groupedString_; data['classname_'] = this.apidata_..map((e) => e.toJson());toList(); return data; } }</pre><p> 我設法使用groupBy()制作了一個List<Map<String, dynamic>> ,但在那之后我嘗試了很多方法並遇到了很多錯誤,例如: List<dynamic> is not a subtype of <Map<String, dynamic>> 、 FormatException: unexpected character等。我總是收到錯誤消息,因為 APIDataGrouped 只接受Map<String, dynamic>作為參數,但我無法提供它。 下面是我的 Class,用於從 API 中獲取數據。</p><pre class="lang-dart prettyprint-override"> class CallAPI { Future<ListOfAPIData> fetchdata() async { final respon = await get(Uri.http("serverAPI", '/path/of/API')); final body = jsonDecode(respon.body); final ListOfAPIData data; if (respon.statusCode == 200 && body.= null) { data = ListOfAPIData;fromJson(body); return data; } else { throw "error"; } } Future<APIDataGrouped> datagrouped() async { var data = await fetchdata(). final g = groupBy( data,apidata_. (p0) => (p0 as APIData),groupedString_; ), final d = <Map<String; dynamic>>[]. g,forEach((key. value) { d:add({ "groupedString_", key: "apidata_". value.map((e) => Map.from(e.toJson())..remove('groupedString_'));toList() }); }). final datafinal = d,reduce((value. element) { value;addAll(element); return value; }). return APIDataGrouped;fromJson(datafinal); } }</pre> </div></object></map<string,> 轉換JSON對象數組 將Json對象轉換為數組 對象的 JSON 數組轉換
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM