Json Serializable - 无效参数(输入)。必须不是空值

问题描述 投票:0回答:1

我试图在我的模型类中设置JSON值。但它返回的错误是 无效参数(输入)。不得为空

UserAccount.dart

import 'package:json_annotation/json_annotation.dart';
part 'userAccount.g.dart';


@JsonSerializable(nullable: true,disallowUnrecognizedKeys:true,includeIfNull:true)
class UserAccount{
     String id;
     String name;
     String email;
     String profile_pic;
     String country;
     String phoneNumber;
     bool isNewUser;
     int role;
     int account_status;
     String token;
     DateTime token_expiry;
     String facebook_profile_url;
     String google_profile_url;
     String twitter_profile_url;
     int matchStixx_count;
     DateTime created_at;
     DateTime updated_at;


     UserAccount({
          this.id,
          this.name,
          this.email,
          this.profile_pic,
          this.country,
          this.phoneNumber,
          this.isNewUser,
          this.role,
          this.account_status,
          this.token,
          this.token_expiry,
          this.facebook_profile_url,
          this.google_profile_url,
          this.twitter_profile_url,
          this.matchStixx_count,
          this.created_at,
         this.updated_at
     });

     factory UserAccount.fromJson(Map<String,dynamic> json) => _$UserAccountFromJson(json);

     Map<String,dynamic> toJson() =>_$UserAccountToJson(this);

}

UserAccount.g.dart

part of 'userAccount.dart';

UserAccount _$UserAccountFromJson(Map<String, dynamic> json) {
  return UserAccount(
      id: json['_id'] as String,
      name: json['name'] as String,
      email: json['email'] as String,
      profile_pic: json['profile_pic'] as String,
      country: json['country'] as String,
      phoneNumber: json['phoneNumber'] as String,
      isNewUser: json['isNewUser'] as bool,
      role: json['role'] as int,
      account_status: json['account_status'] as int,
      token: json['token'] as String,
      token_expiry: DateTime.parse(json['token_expiry'] as String),
      facebook_profile_url: json['facebook_profile_url'] as String,
      google_profile_url: json['google_profile_url'] as String,
      twitter_profile_url: json['twitter_profile_url'] as String,
      matchStixx_count: json['matchStixx_count'] as int,
      created_at: DateTime.parse(json['created_at'] as String),
      updated_at: DateTime.parse(json['updated_at'] as String)
  );
}

Map<String, dynamic> _$UserAccountToJson(UserAccount instance) =>
    <String, dynamic>{
      'id': instance.id,
      'name': instance.name,
      'email': instance.email,
      'profile_pic': instance.profile_pic,
      'country': instance.country,
      'phoneNumber': instance.phoneNumber,
      'isNewUser': instance.isNewUser,
      'role': instance.role,
      'account_status': instance.account_status,
      'token': instance.token,
      'token_expiry': instance.token_expiry,
      'facebook_profile_url': instance.facebook_profile_url,
      'google_profile_url': instance.google_profile_url,
      'twitter_profile_url': instance.twitter_profile_url,
      'matchStixx_count': instance.matchStixx_count,
      'created_at': instance.created_at,
      'updated_at': instance.updated_at,
    };

JSON数据 - 这个JSON存储在( responseBody["userData"] )

{_id: 1, name:some name, email: [email protected], profile_pic: https:/xyzyzz.png。, isNewUser: true, role: 1, account_status: 1, matchStixx_count: 20, created_at., 2020-05-15T06:41:24.528Z, __v: 0}。2020-05-15T06:41:24.528Z, __v: 0}。

模型的初始化

userAccount = new UserAccount.fromJson(responseBody["userData"]); //geting error here
json flutter dart nsjsonserialization jsonserializer
1个回答
1
投票

如果你发布完整的stacktrace会更容易,因为它包含了哪些字段是空的信息。

Unhandled exception:
Invalid argument(s) (input): Must not be null
#0      _RegExp.firstMatch (dart:core-patch/regexp_patch.dart:222:24)
#1      DateTime.parse (dart:core/date_time.dart:282:22)
#2      _$UserAccountFromJson (file:///stackoverflow.dart:64:30)
#3      new UserAccount.fromJson (file:///stackoverflow.dart:47:7)
#4      main (file:///stackoverflow.dart:5:15)
#5      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#6      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

在代码中的问题行如下:

      token_expiry: DateTime.parse(json['token_expiry'] as String),

由于你的json不包含 token_expiry 那么这里的结果将是空的。但由于 DateTime.parse 不接受null作为输入,你会得到 "Must not be null "的错误信息。

为了解决这个问题,你可以把这行改成这样。

token_expiry: json['token_expiry'] == null ? null : DateTime.parse(json['token_expiry'] as String),

这样一来,字段就会出现同样的错误。updated_at 所以你也应该适当的做。

created_at: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String),
updated_at: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String));
© www.soinside.com 2019 - 2024. All rights reserved.