Как разобрать json данных с динамически меняющимися ключами во флаттере? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть объект json с динамически меняющимся ключом, который предоставляется с последним элементом элемента списка. На основе этого списка ключей я должен отобразить ответ json. Как я могу разобрать этот тип объекта json?

Json ответ:

Например: 1

[
 {"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

 [
  {"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,

{
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]],
..............
...............
...........
},
......

Список ключей будет изменен случайно.

1 Ответ

0 голосов
/ 20 июня 2020

Я действительно не уверен, что это то, что вы хотите, но вот моя реализация:

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"}
]
''';

Структура данных результата не такая, как вы описали в своем вопросе, но это потому, что она делает очень мало смысла в этом, так как это не может эффективно масштабироваться, а количество значений динамически c.

Вместо этого результат представлен в структуре List<List<int>>, поэтому второе значение первого результата может быть, например, извлечено как parsedElementsEg2[0][1] и упрощает l oop через значения;

...