【问题标题】:Parsing JSON in Flutter results in NULL values of objects's fields在 Flutter 中解析 JSON 会导致对象字段的 NULL 值
【发布时间】:2020-02-07 07:13:42
【问题描述】:

我有一个 JSON 文件,结构如下:

[
 {
  "key1":"value1",
  "key2":"value2",
  "key3":"value3",
  "key4":"value4",
 },
 {
  "key1":"value1",
  "key2":"value2",
  "key3":"value3",
  "key4":"value4",
 }
]

我通过 HTTP 调用得到了它。我尝试将此 JSON 解析为颤振对象。因此我写了一个类:

class Foo {
 List<Model> modelsAsJson;

 Foo({this.modelsAsJson});

 Foo.fromJson(List<dynamic> jsonData) {
  modelsAsJson = jsonData.map((listItem) => Model.fromJson(listItem)).toList();
  Foo(modelsAsJson: modelsAsJson);
 }
}

我还为Model写了另一个类:

class Model {
 String value1;
 String value2;
 String value3;
 String value4;

 Model({this.value1, this.value2, this.value3, this.value4});

 Model.fromJson(Map<String, dynamic> json) {
  Model(value1: json['key1'], value2: json['key2'], value3: json['key3'], value4: json['key4'],);
 }

 Map<String, dynamic> toJson() => {
    'key1': value1,
    'key2': value2,
    'key3': value3,
    'key4': value4
  };
}

通过 HTTP 获取数据后,我将其解析为给定的对象,如下所示: http.Response = http.get(urlHere); 最终decodedJson = jsonDecode(response.body); 结果 = Foo.fromJson(decodedJson).modelsAsJson;

解析后的结果从modelsAsJson 得到正确的长度,但该列表中的每个model 的value1..value4 都是nulls。我做错了什么?

【问题讨论】:

  • 另一个最好的办法是让你的模型类属性最终并在你的构造函数中初始化它们,如Model(//.... obj) : value = obj["key"], //...;

标签: json flutter dart


【解决方案1】:

在您的情况下,Model.fromJson(Map&lt;String, dynamic&gt; json) 是一个命名构造函数,因此在括号内应该完成初始化。取而代之的是,您只是在构造函数中创建了一个新的 Model 并且什么都不做。这就是模型中的字段保持未初始化的原因(默认为null)。

应该这样写:

Model.fromJson(Map<String, dynamic> json) {
  value1 = json['key1'];
  value2 = json['key2'];
  value3 = json['key3'];
  value4 = json['key4'];
}

或者你可以使用工厂构造函数:

factory Model.fromJson(Map<String, dynamic> json) => Model(
    value1: json['key1'],
    value2: json['key2'],
    value3: json['key3'],
    value4: json['key4'],
  );

【讨论】:

  • 正确。您还可以使用重定向非工厂构造函数:Model.fromJson(Map&lt;String, dynamic&gt; json) : this(value1: json["key1"], value2: json["key2"], value3: json["key3"], value4: json["key4"]);.
【解决方案2】:

尝试用以下替换您的模型类

// To parse this JSON data, do
//
//     final model = modelFromJson(jsonString);

import 'dart:convert';

List<Model> modelFromJson(String str) => List<Model>.from(json.decode(str).map((x) => Model.fromJson(x)));

String modelToJson(List<Model> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Model {
    String key1;
    String key2;
    String key3;
    String key4;

    Model({
        this.key1,
        this.key2,
        this.key3,
        this.key4,
    });

    factory Model.fromJson(Map<String, dynamic> json) => Model(
        key1: json["key1"] == null ? null : json["key1"],
        key2: json["key2"] == null ? null : json["key2"],
        key3: json["key3"] == null ? null : json["key3"],
        key4: json["key4"] == null ? null : json["key4"],
    );

    Map<String, dynamic> toJson() => {
        "key1": key1 == null ? null : key1,
        "key2": key2 == null ? null : key2,
        "key3": key3 == null ? null : key3,
        "key4": key4 == null ? null : key4,
    };
}

并使用下面的代码进行解析

List<Model> modelList = modelFromJson('Your Json String);

【讨论】:

  • key1: json["key1"] ?? null 如果空运算符是设置默认值的更好方法,而不是key1: json["key1"] == null ? null : json["key1"],
  • 这个解决方案对我来说在 Null Safety 中不起作用。谢谢。
猜你喜欢
  • 2022-01-09
  • 2023-04-02
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2019-11-27
  • 2018-05-07
  • 2021-03-19
相关资源
最近更新 更多