首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用动态键但结构化的值将json反序列化为Map<String,ModelClass>

用动态键但结构化的值将json反序列化为Map<String,ModelClass>
EN

Stack Overflow用户
提问于 2019-09-17 14:30:54
回答 3查看 9.5K关注 0票数 1

是否有可能用动态键但结构化的值反序列化一个json到Map中。

我有个json

代码语言:javascript
复制
{
   "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
}

我希望它在flutter/dart中反序列化到下面的一个模型类中

代码语言:javascript
复制
class Data {
    Map<String, Item> itemMap;

    factory Data.fromJson(Map<String,dynamic> json) {
        itemMap : json["data"]; //How to parse.
    }
}

class Item {
   int qty;
   int price;
}

我已经阅读了一个媒体博客,甚至这个也没有涵盖地图部分。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-18 06:08:41

我找到了实现这一目标的方法。我们可以将Map从一种类型转换为另一种类型。

代码语言:javascript
复制
class Data {
    Map<String, Item> itemMap;

    factory Data.fromJson(Map<String,dynamic> json) {
        itemMap : getMapDataFrom(json["data"]); //How to parse.
    }

    static Map<String, Item> getFruitItemMap(Map<String, dynamic> map) {
       final Map<String, Item> fruitItemMap = HashMap();
       map.forEach((name, value) {
           bitItemLites[name] = Item.fromJson(value, name);
       });

       return bitItemLites;
    }
}

class Item {
   int qty;
   int price;

   factory Item.fromJson(Map<String,dynamic> json) {
      return Item(json['qty'], json['price']);
   }
}
票数 0
EN

Stack Overflow用户

发布于 2019-09-17 15:06:36

你需要这样做:

代码语言:javascript
复制
//...
Future<List<ItemModel>> fetchFood() async {

    List<ItemModel> foodItemsList = [];

    // Get json response and parse it as a Map<String, dynamic>
    final response = {
       "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
       };
    // with your real get request use this:
    // final parsedJson = json.decode(response.body)['data'];

    // Parsed Json have what's inside data, in case of real request look for the line above this.
    final parsedJson = response['data'];

    // Iterate over all fruits and create Item object from each,
    // then push to a list of Item's objects to return it.
    parsedJson.forEach((k,v) => foodItemsList.add(ItemModel.fromJson(v)));

    return foodItemsList;
}

// Item model
class ItemModel {
   int qty;
   int price;

   ItemModel.fromJson(Map<String,dynamic> parsedJson)
      : qty = parsedJson['qty'],
        price = parsedJson['price'];

}

// Then call it
main() async {

  List<ItemModel> foodItemsList = await fetchFood();
  //..
}

如果需要将水果名称作为对象的一部分,则为

代码语言:javascript
复制
//...
Future<List<ItemModel>> fetchFood() async {

    List<ItemModel> foodItemsList = [];

    // Get json response and parse it as a Map<String, dynamic>
    final response = {
       "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
       };
    // with your real get request use this:
    // final parsedJson = json.decode(response.body)['data'];

    // Parsed Json have what's inside data, in case of real request look for the line above this.
    final parsedJson = response['data'];

    // Iterate over all fruits and create Item object from each,
    // then push to a list of Item's objects to return it.
    parsedJson.forEach((fruitName, fruitDetails) 
        => foodItemsList.add(
             ItemModel.fromJson(fruitName, fruitDetails)
        )
    );

    return foodItemsList;
}

// Item model
class ItemModel {
   String name;
   int qty;
   int price;

   ItemModel.fromJson(String fruitName, Map<String,dynamic> parsedJson)
      : name = fruitName,
        qty = parsedJson['qty'],
        price = parsedJson['price'];

}

// Then call it
main() async {

  List<ItemModel> foodItemsList = await fetchFood();
  print(foodItemsList[1].name); //orange
  //..
}
票数 4
EN

Stack Overflow用户

发布于 2020-07-13 05:45:41

我有一个类似的JSON,但有几处更改:

代码语言:javascript
复制
{
  "sub_item": {
    "491": ["92837|1.3|Pistachio|right", "92838|2.5|Hazelnut|left"],
    "427": ["92839|7.05|Almonds|", "92840|5.12|Walnuts|"],
    "396": ["92841|15|Saffron|"],
    "275": ["92842|45|Caviar|"]
  }
}

sub_item映射的密钥(491427396275和.)是动态的(作为标签,而不是类型),并且会根据订单进行更改。例如,是376,325,493.以另一种顺序。

我想在我的颤音应用程序中同时显示键和值,并且不知道如何获取这些数据并分别显示它们。就像这样:

代码语言:javascript
复制
491:
£1.30  Pistachio
£2.50  Hazelnut

427:
£7.05  Almonds
£5.12  Walnuts

396:
£15.00 Saffron

275:
£45.00 Caviar

我使用了这段代码,它在某种程度上对我起了作用,但它只显示了列表的第一项。例如,它只显示491的Pistachio,而不显示榛子;它只显示杏仁( 427 ),而不显示核桃

代码语言:javascript
复制
Future<List<ItemModel>> fetchFood() async {
  List<ItemModel> foodItemsList = [];

  final response = {
    "sub_item": {
      "491": ["92837|1.3|Pistachio|right", "92838|2.5|Hazelnut|left"],
      "427": ["92839|7.05|Almonds|", "92840|5.12|Walnuts|"],
      "396": ["92841|15|Saffron|"],
      "275": ["92842|45|Caviar|"]
    }
  };

  final parsedJson = response['sub_item'];

  parsedJson.forEach((fruitName, fruitDetails) =>
      foodItemsList.add(ItemModel.fromJson(fruitName, fruitDetails)));

  return foodItemsList;
}

// Item model
class ItemModel {
  String id;
  String details;

  ItemModel.fromJson(String subItemID, List<dynamic> subItemDetails)
      : id = subItemID,
        details = subItemDetails[0];
}

// Then call it
mainTest() async {
  List<ItemModel> foodItemsList = await fetchFood();
  for (var i = 0, j = 0;
      i < foodItemsList.length;
      j < foodItemsList[i].details.length, i++, j++) {
    print(foodItemsList[i].id);
    print(foodItemsList[j].details.split('|')[2]);
  }
}

控制台的结果是:

代码语言:javascript
复制
flutter: 491
flutter: Pistachio
flutter: 427
flutter: Almonds
flutter: 396
flutter: Saffron
flutter: 275
flutter: Caviar
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57976532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档