проблема флаттера в json парсинге динамических c ключевых значений - PullRequest
1 голос
/ 01 августа 2020

Ниже приведен результат моего JSON

{
    "success": true,
    "data": {
        "ones": [{
                "id": "2",
                "username": "LM10002"
            },
            {
                "id": "6",
                "username": "LM10006"
            }
        ],
        "twos": [{
                "id": "3",
                "username": "LM10003"
            },
            {
                "id": "8",
                "username": "LM10008"
            }
        ],
        "threes": [{
            "id": "4",
            "username": "LM10004"
        }],
        "fours": [{
                "id": "5",
                "username": "LM10005"
            },
            {
                "id": "14",
                "username": "GT10014"
            }
        ]
    }
}

Здесь ключи ones, twos, threes, fours являются динамическими c значениями ключей, которые я пробовал разобрать и смог получить значения

  DownLineModel({this.success, this.data});
  DownLineModel.fromJson(Map<String, dynamic> json) {
    success = json['success'];
    data = json['data'];
    print(data);

как я могу разобрать json, найти ключевые термины и снова проанализировать их.

Ответы [ 4 ]

2 голосов
/ 01 августа 2020

Если this.data не является Map<dynamic, dynamic>, ваш код не будет работать. Вы должны создать отдельный класс для свойства data с собственным методом DataModel.fromJson(Map json). А затем в конструкторе DownLineModel вы просто анализируете данные json следующим образом:

this.data = DataModel.fromJson(jsonData);
1 голос
/ 02 августа 2020

Просто посмотрите пример, который я сделал для вас на основе json, который вы предоставили.

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:json_parsing_example/models.dart';
import 'package:http/http.dart' as http;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: HomePage());
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  double value;

  String json = '''
  {
    "success": true,
    "data": {
        "ones": [{
                "id": "2",
                "username": "LM10002"
            },
            {
                "id": "6",
                "username": "LM10006"
            }
        ],
        "twos": [{
                "id": "3",
                "username": "LM10003"
            },
            {
                "id": "8",
                "username": "LM10008"
            }
        ],
        "threes": [{
            "id": "4",
            "username": "LM10004"
        }],
        "fours": [{
                "id": "5",
                "username": "LM10005"
            },
            {
                "id": "14",
                "username": "GT10014"
            }
        ]
    }
}
  
  ''';
  @override
  void initState() {
    super.initState();

    getData();
  }

  getData() {
    Map mapValue = jsonDecode(json);
    // This is where you iterate via the data object
    // that is the value which is key,value pair
    List<Data> data = List();
    mapValue['data'].forEach((key, value) {
      List<User> user = List();
      value.forEach((item) {
        user.add(User(id: item['id'], username: item['username']));
      });
      data.add(Data(name: key, userList: user));
    });

    data.forEach((element) {
      print(element.name + " : " + '${element.userList.length}');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(child: Text('s')),
    );
  }
}

class Data {
  final String name;
  final List<User> userList;

  Data({this.name, this.userList});
}

class User {
  final String id;
  final String username;

  User({this.id, this.username});
}

Сообщите мне, работает ли он.

0 голосов
/ 02 августа 2020

json['data'] будет Map<String, dynamic>. Таким образом, вы можете перебирать эти ключи Dynami c, используя forEach.

json['data'].forEach((dynamicKey, list) {
  // dynamicKey will be 'ones', 'twos', ....
  // list will be the corresponding list of maps
});
0 голосов
/ 01 августа 2020

Предполагая, что когда вы сделаете это print(data), вы получите этот ответ

    {
        "ones": [{
                "id": "2",
                "username": "LM10002"
            },
            {
                "id": "6",
                "username": "LM10006"
            }
        ],
        "twos": [{
                "id": "3",
                "username": "LM10003"
            },
            {
                "id": "8",
                "username": "LM10008"
            }
        ],
        "threes": [{
            "id": "4",
            "username": "LM10004"
        }],
        "fours": [{
                "id": "5",
                "username": "LM10005"
            },
            {
                "id": "14",
                "username": "GT10014"
            }
        ]
    }

Теперь, что мы можем сделать, это снова перебрать данные и найти dynamic keys как ones, twos ....

Мы можем сделать что-то подобное. Показываю только для ones, можно сделать для res

//for ones
List<Map<String, String>> ones = data["ones"];

//iterating over it
ones.forEach((element){
   // we are now inside the array
   // iterating over element which is {"id": "", "username": ""}
   element.forEach((key, value){
      print("$key => $value");
   });
});

// OUTPUT
// id => 2
// username => LM10002
// id => 6
// username => LM10006
...