Ошибка преобразования Json в объект, который содержит список объектов - PullRequest
1 голос
/ 27 июня 2019

Я получил ответ, полученный от запроса API, который я декодировал в объект JSON. При попытке преобразовать этот объект Json в мой класс, содержащий список объектов, я сталкиваюсь со следующей ошибкой:

"Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'".

Я понимаю значение ошибки, но не могу найти ее решение. Ресурсы на эту конкретную вещь в Dart довольно ограничены.

Я несколько раз пытался переписать свой метод fromJson, но продолжаю сталкиваться с той же ошибкой.

Ниже мой класс UserList , в который я пытаюсь преобразовать объект Json.

    class UserList {
      final List<UserObject> users;
      UserList({
        this.users,
      });

      addUser(UserObject user){
        users.add(user);
      }

      factory UserList.fromJson(List<dynamic> parsedJson) {
        List<UserObject> users = new List<UserObject>();
        users = parsedJson.map((i)=>UserObject.fromJson(i)).toList();

        return new UserList(
            users: users
        );
      }

      Map<String, dynamic> itemToJson() {
        return <String, dynamic>{
          'UserVal': this.users,
        };
      }

    }

И вот где я вызываю метод fromJson:

    UserList list = UserList.fromJson(userVal);

userVal равно следующему:

{UserVal: [{UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test1}, {UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test2}, {UID: test, Email: test@gmail.com, Phone: 1110001111, Name: Test3}, {UID: test, Email: test, Phone: 1110001111, Name: test4}]}

Вывод, который я ищу, должен иметь законченный объект, который мой метод может затем вернуть и использовать. Тем не менее, это прерывает при вызове этого метода.

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете запустить следующий код и попытаться понять, как он работает, чтобы понять, почему ваш код работает неправильно.

import 'dart:convert';

import 'json_objects.dart';

void main() {  
  var list = UserList.fromJson(userVal);
  for (var user in list.userVal) {
    print('Name: ${user.name}');
    print('Email: ${user.email}');
  }  
}

var userVal = {
  'UserVal': [
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test1'
    },
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test2'
    },
    {
      'UID': 'test',
      'Email': 'test@gmail.com',
      'Phone': '1110001111',
      'Name': 'Test3'
    },
    {'UID': 'test', 'Email': 'test', 'Phone': '1110001111', 'Name': 'test4'}
  ]
};

Результат:

Name: Test1
Email: test@gmail.com
Name: Test2
Email: test@gmail.com
Name: Test3
Email: test@gmail.com
Name: test4
Email: test

Данные JSONмодели (генерируемые инструментом):

class User {
  final String email;
  final String name;
  final String phone;
  final String uID;

  User({this.email, this.name, this.phone, this.uID});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      email: json['Email'] as String,
      name: json['Name'] as String,
      phone: json['Phone'] as String,
      uID: json['UID'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'Email': email,
      'Name': name,
      'Phone': phone,
      'UID': uID,
    };
  }
}

class UserList {
  final List<User> userVal;

  UserList({this.userVal});

  factory UserList.fromJson(Map<String, dynamic> json) {
    return UserList(
      userVal: _toObjectList(json['UserVal'], (e) => User.fromJson(e)),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'UserVal': _fromList(userVal, (e) => e.toJson()),
    };
  }
}

List _fromList(data, Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

List<T> _toObjectList<T>(data, T Function(Map<String, dynamic>) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element as Map<String, dynamic>);
    }
    result.add(value);
  }
  return result;
}

/*
UserList:
  UserVal: List<User>

User:
  UID: String
  Email: String
  Phone: String
  Name: String
*/

...