Flutter 在颤振中使用JsonSerializable时如何识别动态键?

Flutter 在颤振中使用JsonSerializable时如何识别动态键?,flutter,dart,Flutter,Dart,让我们假设,直到最近,我还收到了下面的Json响应 { "AA": { "product": { "id":"111", "type":"C" } } } 而且,我已经编写了下面的代码,model.dart来将json转换为object 模型.省道 @JsonSerializable() class ResponseGate { @JsonKey(name: "AA") AA aa;

让我们假设,直到最近,我还收到了下面的
Json响应

{
   "AA": {
         "product": {
            "id":"111",
            "type":"C"
         }
    }
}
而且,我已经编写了下面的代码,
model.dart
来将json转换为object

模型.省道

@JsonSerializable()
class ResponseGate {
  @JsonKey(name: "AA")
  AA aa;

  ResponseGate({this.aa});
  factory ResponseGate.fromJson(Map<String, dynamic> json) =>
      _$ResponseGateFromJson(json);
}

@JsonSerializable()
class AA {
  @JsonKey(name: "product")
  Product product;

  AA(this.product);
  factory AA.fromJson(Map<String, dynamic> json) => _$AAFromJson(json);
}

@JsonSerializable()
class Product {
  @JsonKey(name: "id")
  var id;
  @JsonKey(name: "type")
  var type;

  Product(this.id, this.type);
  factory Product.fromJson(Map<String, dynamic> json) =>
      _$ProductFromJson(json);
}
只是钥匙(AA和BB)不同,但它们的子项是相同的。我必须做些什么才能使我的代码识别所有的键并使用
model.dart
从json转换为model

if (thirdResponse.statusCode == 200) {
  var map = json.decode(thirdResponse.body) as Map<String, dynamic>;
  ResponseGate responseGate = new ResponseGate.fromJson(map);
else {
  throw Exception('Failed to load post: ${thirdResponse.statusCode}');
}
if(thirdResponse.statusCode==200){
var map=json.decode(thirdResponse.body)作为map;
ResponseGate ResponseGate=newresponsegate.fromJson(map);
否则{
抛出异常('未能加载post:${thirdResponse.statusCode}');
}

不要使用模型尝试将您的响应放在地图中 那么比如说

{
   "AA": {
       "product": {
           "id":"111",
           "type":"C"
       }
   },
   "BB": {
       "product": {
           "id":"222",
           "type":"d"
       }
   }
}
如果您想要“BB”产品“id” 那样会很糟糕的

map['BB']['product']['id']

不要使用模型试图把你的反应放在地图上 那么比如说

{
   "AA": {
       "product": {
           "id":"111",
           "type":"C"
       }
   },
   "BB": {
       "product": {
           "id":"222",
           "type":"d"
       }
   }
}
如果您想要“BB”产品“id” 那样会很糟糕的

map['BB']['product']['id']

我看到你有解码的地图,这是我测试的代码

  • 迭代
    映射
  • var数据={
    “AA”:{
    “产品”:{
    “id”:“111”,
    “类型”:“C”
    }
    },
    “BB”:{
    “产品”:{
    “id”:“222”,
    “类型”:“d”
    }
    }
    };
    var list=新列表();
    data.forEach((键,值){
    列表。添加(值);
    });
    打印(列表);
    
  • 转换为
    产品
  • 
    对于(列表中的var productInfo)
    {
    Product Product=new Product.fromJson(productInfo);
    //将产品添加到您的列表。。。
    }
    
    或者你可以把两者结合起来,也可以得到钥匙

      data.forEach((key, value){
         Product product = new Product.fromJson(value);
         // add product to your List...
         // or make a Map to store (key, product)
      });
    
    但还有另一种方法,将api修改为数组,并使json响应更有意义

    [
       {
           "productName": "AA"
           "id":"222",
           "type":"d"
       }
    ]
    

    我只是在开玩笑说最后的方法,因为你没有太多地谈论你的场景。

    我看到你有解码的地图,所以这是我测试的代码

  • 迭代
    映射
  • var数据={
    “AA”:{
    “产品”:{
    “id”:“111”,
    “类型”:“C”
    }
    },
    “BB”:{
    “产品”:{
    “id”:“222”,
    “类型”:“d”
    }
    }
    };
    var list=新列表();
    data.forEach((键,值){
    列表。添加(值);
    });
    打印(列表);
    
  • 转换为
    产品
  • 
    对于(列表中的var productInfo)
    {
    Product Product=new Product.fromJson(productInfo);
    //将产品添加到您的列表。。。
    }
    
    或者你可以把两者结合起来,也可以得到钥匙

      data.forEach((key, value){
         Product product = new Product.fromJson(value);
         // add product to your List...
         // or make a Map to store (key, product)
      });
    
    但还有另一种方法,将api修改为数组,并使json响应更有意义

    [
       {
           "productName": "AA"
           "id":"222",
           "type":"d"
       }
    ]
    

    最后一种方法只是开玩笑,因为你没有太多地谈论你的场景。

    你是说api中的JSON在数组的情况下使用
    object
    而不是
    array
    ?如果这是真的,你可能需要先编写自定义解析器,然后在解析后使用
    JsonSerializable
    。你能告诉我如何进行自定义吗解析器?你是说api中的JSON在数组的情况下使用
    object
    而不是
    array
    ?如果这是真的,你可能需要先编写自定义解析器,然后在解析后使用
    JsonSerializable
    。你能告诉我如何做自定义解析器吗?有人能解释为什么吗?有人能解释为什么吗?