首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在flutter中解析动态变化的键的json数据?

如何在flutter中解析动态变化的键的json数据?
EN

Stack Overflow用户
提问于 2020-06-20 21:00:06
回答 1查看 450关注 0票数 0

我有一个带有动态变化键的json对象,它随列表项的最后一个元素一起提供。基于这个keyList,我必须映射json响应。如何解析这种类型的json对象?

Json响应:

例如:1

代码语言:javascript
复制
[
 {"ABC":100, "BVBV":200,"NBN":87,"MNM":09},
 {"ABC":1004, "BVBV":90,"NBN":847,"MNM":049},
 {"ABC":1040, "BVBV":2050,"NBN":867,"MNM":079},

 {"overallScore":10000,"keyList":"ABC,BVBV,NBN,MNM"}
]

例如:2

代码语言:javascript
复制
 [
  {"PQR":100, "XYZ":200,"POI":87,"IOK":09,"LOP":890,"MLP":678},
  {"PQR":1004, "XYZ":90,"POI":847,"IOK":049,"LOP":890,"MLP":678},
  {"PQR":1040, "XYZ":2050,"POI":867,"IOK":079,"LOP":890,"MLP":678},

  {"overallScore":10000,"keyList":"PQR,XYZ,POI,IOK,LOP,MLP"}
]

Json密钥基于json响应中的最后一个元素。

下面是预期的json映射,

代码语言:javascript
复制
{
value1 = json[json['keyList'].split(',')[0]],
value2 = json[json['keyList'].split(',')[1]],
value3 = json[json['keyList'].split(',')[2]],
value4 = json[json['keyList'].split(',')[3]],
value5 = json[json['keyList'].split(',')[4]],
..............
...............
...........
},

{
value1 = json[json['keyList'].split(',')[0]],
value2 = json[json['keyList'].split(',')[1]],
value3 = json[json['keyList'].split(',')[2]],
value4 = json[json['keyList'].split(',')[3]],
value5 = json[json['keyList'].split(',')[4]],
..............
...............
...........
},
......

密钥列表将随机更改。

EN

回答 1

Stack Overflow用户

发布于 2020-06-20 22:46:01

我真的不确定这是不是你想要的,但这是我的实现:

代码语言:javascript
复制
import 'dart:convert';
import 'dart:io';

void main() {
  final jsonEg1 = jsonDecode(eg1) as List<dynamic>;
  final keyListEg1 = parseKeyList(jsonEg1);

  print(keyListEg1);
  // [ABC, BVBV, NBN, MNM]

  print(parseElements(jsonEg1));
  // [[100, 200, 87, 9], [1004, 90, 847, 49], [1040, 2050, 867, 79]]

  final jsonEg2 = jsonDecode(eg2) as List<dynamic>;
  final keyListEg2 = parseKeyList(jsonEg2);

  print(keyListEg2);
  // [PQR, XYZ, POI, IOK, LOP, MLP]

  print(parseElements(jsonEg2));
  // [[100, 200, 87, 9, 890, 678], [1004, 90, 847, 49, 890, 678], [1040, 2050, 867, 79, 890, 678]]
}

List<String> parseKeyList(List<dynamic> json) =>
    ((json.last as Map<String, dynamic>)['keyList'] as String).split(',');

List<List<int>> parseElements(List<dynamic> json) {
  final result = json
      .take(json.length - 1)
      .cast<Map<String, dynamic>>()
      .map((data) => parseKeyList(json).map((key) => data[key] as int).toList())
      .toList();

  return result;
}

const String eg1 = '''
[
 {"ABC":100, "BVBV":200,"NBN":87,"MNM":9},
 {"ABC":1004, "BVBV":90,"NBN":847,"MNM":49},
 {"ABC":1040, "BVBV":2050,"NBN":867,"MNM":79},

 {"overallScore":10000,"keyList":"ABC,BVBV,NBN,MNM"}
]
''';

const String eg2 = '''
 [
 {"PQR":100, "XYZ":200,"POI":87,"IOK":9,"LOP":890,"MLP":678},
 {"PQR":1004, "XYZ":90,"POI":847,"IOK":49,"LOP":890,"MLP":678},
 {"PQR":1040, "XYZ":2050,"POI":867,"IOK":79,"LOP":890,"MLP":678},

 {"overallScore":10000,"keyList":"PQR,XYZ,POI,IOK,LOP,MLP"}
]
''';

结果的数据结构不像您在问题中描述的那样,但这是因为这样做没有什么意义,因为它不能有效地扩展,并且值的数量是动态的。

取而代之的是,结果以List<List<int>>结构表示,因此第一结果第二值可以例如被提取为parsedElementsEg2[0][1],并且使得循环遍历这些值也变得更容易;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62486134

复制
相关文章

相似问题

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