Как разобрать массив json в список в dart? - PullRequest
0 голосов
/ 14 июля 2020

Что касается сценария ниже, у меня есть два разных json для одной записи и несколько записей в виде списка. Я могу анализировать отдельные данные с помощью класса Person. Для json со списком я использую класс PersonList, но получаю сообщение об ошибке, потому что ключ json result больше не нужен. Есть ли способ проанализировать список без изменения класса Person? Или мне не следует использовать класс PersonList, а просто создать List<Person>?

Я видел этот пример, но он работает только в том случае, если json представляет собой целый список, например this

var jsonResponse = convert.jsonDecode(rawJsonMulti) as List;
    return jsonResponse.map((p) => Person.fromJson(p).toList();

Не могли бы вы показать мне, как использовать приведенный выше сценарий, используя мой json. Спасибо.

import 'dart:convert';
void main() {

  String rawJsonMulti = '{"result": [{"name":"Mary","age":30},{"name":"John","age":25}]}';
  String rawJsonSingle = '{"result": {"name":"Mary","age":30}}';
  
// Working for non list json  
//   final result = json.decode(rawJsonSingle);
//   var obj = Person.fromJson(result);
//   print(obj.name);

  
  final result = json.decode(rawJsonMulti);
  var obj = PersonList.fromJson(result);
  print(obj.listOfPerson[0].name);

}


  class PersonList {
  final List<Person> listOfPerson;

  PersonList({this.listOfPerson});

  factory PersonList.fromJson(Map<String, dynamic> json) {
    var personFromJson = json['result'] as List;

    List<Person> lst =
        personFromJson.map((i) => Person.fromJson(i)).toList();

    return PersonList(listOfPerson: lst);
  }
}


  class Person {
    String name;
    int age;
    
    //will only work on result is not a list
    Person({this.name, this.age});
    factory Person.fromJson(Map<String, dynamic> json) {
      return Person(name: json['result']['name'],
                   age: json['result']['age']);
    }

//  This will work on json with list but not in single
//  factory Person.fromJson(Map<String, dynamic> json) {
//       return Person(name: json['name'],
//                    age: json['age']);
//     }
    

  }

1 Ответ

0 голосов
/ 14 июля 2020

Попробуйте взглянуть на это решение, в котором я исправил ваш код:

import 'dart:convert';

void main() {
  const rawJsonMulti =
      '{"result": [{"name":"Mary","age":30},{"name":"John","age":25}]}';
  const rawJsonSingle = '{"result": {"name":"Mary","age":30}}';

  final resultMulti = json.decode(rawJsonMulti) as Map<String, dynamic>;
  final personListMulti = PersonList.fromJson(resultMulti);
  print(personListMulti.listOfPerson[0]); // Mary (age: 30)
  print(personListMulti.listOfPerson[1]); // John (age: 25)

  final resultSingle = json.decode(rawJsonSingle) as Map<String, dynamic>;
  final personListSingle = PersonList.fromJson(resultMulti);
  print(personListSingle.listOfPerson[0]); // Mary (age: 30)
}

class PersonList {
  final List<Person> listOfPerson;

  PersonList({this.listOfPerson});

  factory PersonList.fromJson(Map<String, dynamic> json) {
    if (json['result'] is List) {
      final personsFromJson = json['result'] as List;
      return PersonList(listOfPerson: [
        ...personsFromJson
            .cast<Map<String, Object>>()
            .map((i) => Person.fromJson(i))
      ]);
    } else {
      final personFromJson = json['result'] as Map<String, Object>;
      return PersonList(listOfPerson: [Person.fromJson(personFromJson)]);
    }
  }
}

class Person {
  String name;
  int age;

  Person({this.name, this.age});
  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(name: json['name'] as String, age: json['age'] as int);
  }

  @override
  String toString() => '$name (age: $age)';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...