映射嵌套JSON时如何检查NULL?

时间:2018-12-28 17:24:23

标签: json dart flutter

我正在尝试将嵌套的JSON映射到模型对象,问题是当它返回null时,它将破坏所有代码,我想检查null是否可以执行某些操作但不破坏应用程序。

JSON文件:

[
    {
        "id": 53,
        "date": "2018-12-28T08:51:11",
        "title": {
            "rendered": "this is for featured"
        },
        "content": {
            "rendered": "\n<p><g class=\"gr_ gr_3 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling\" id=\"3\" data-gr-id=\"3\">sdafkj</g> <g class=\"gr_ gr_10 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"10\" data-gr-id=\"10\">kj</g> <g class=\"gr_ gr_16 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"16\" data-gr-id=\"16\">asd</g> <g class=\"gr_ gr_18 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling\" id=\"18\" data-gr-id=\"18\">kadjsfk</g> kljadfklj sd</p>\n",
            "protected": false
        },
        "excerpt": {
            "rendered": "<p>sdafkj kj asd kadjsfk kljadfklj sd</p>\n",
            "protected": false
        },
        "author": 1,
        "featured_media": 54,
        "_links": {
            "self": [
                {
                    "href": "https://client.kurd.app/wp-json/wp/v2/posts/53"
                }
            ],

        },
        "_embedded": {
            "author": [
                {
                    "id": 1,
                    "name": "hooshyar",

                }
            ],
            "wp:featuredmedia": [
                {
                    "id": 54,

                    "source_url": "https://client.kurd.app/wp-content/uploads/2018/12/icannotknow_22_12_2018_18_48_11_430.jpg",
                    }
                    ]
}
]

映射到对象的代码:

  featuredMediaUrl = map ["_embedded"]["wp:featuredmedia"][0]["source_url"];

方法'map'在null上调用。 接收方:null [0],有时返回null;

2 个答案:

答案 0 :(得分:1)

在我的评论之后,我建议您使用代码生成库将JSON解析为JSON Models

阅读this article,其中介绍了如何使用(例如)json_serializable软件包。

此类库承担生成所有样板代码的所有繁琐工作来创建您的Model类,并且它们将null值视为强制值。

例如,如果您对一个类Person进行注释:

@JsonSerializable(nullable: true)
class Person {
  final String firstName;
  final String lastName;
  final DateTime dateOfBirth;
  Person({this.firstName, this.lastName, this.dateOfBirth});
  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  Map<String, dynamic> toJson() => _$PersonToJson(this);
}

使用(nullable: true)模型的dart类将跳过空值字段。

enter image description here

更新

因为我渴望技术,所以我尝试使用quicktype工具(由Christoph Lachenicht建议)。

我已经准备好一个mock api和一个文件example.json,以提供您发布的JSON。我只用了一个元素,而不是数组。您可以在这里example.json看看。

在安装QuickType后,我已经为此json生成了模型类:

quicktype --lang dart --all-properties-optional example.json -o example.dart

这里请注意cli参数--all-properties-optional,该参数会为缺失的字段创建空检查。

Map<String, dynamic> toJson() => {
    "id": id == null ? null : id,
    "date": date == null ? null : date,
    "title": title == null ? null : title.toJson(),
    "content": content == null ? null : content.toJson(),
    "excerpt": excerpt == null ? null : excerpt.toJson(),
    "author": author == null ? null : author,
    "featured_media": featuredMedia == null ? null : featuredMedia,
    "_links": links == null ? null : links.toJson(),
    "_embedded": embedded == null ? null : embedded.toJson(),
};

然后我在example.dart中使用了Example类

var jsonExampleResponse =
    await http.get('https://www.shadowsheep.it/so/53962129/testjson.php');
print(jsonExampleResponse.body);

var exampleClass = exampleFromJson(jsonExampleResponse.body);
print(exampleClass.toJson());

一切顺利。

N.B。 当然,当您使用此类时,必须在使用它们之前检查其字段是否为空:

print(exampleClass.embedded?.wpFeaturedmedia?.toString());

仅此而已。我希望能使您处于正确的方向。

答案 1 :(得分:1)

这是一个简单的解决方案:

safeMapSearch(Map map, List keys) {
  if (map[keys[0]] != null) {
    if (keys.length == 1) {
      return map[keys[0]];
    }
    List tmpList = List.from(keys);
    tmpList.removeAt(0);
    return safeMapSearch(map[keys[0]], tmpList);
  }
  return null;
}

使用:

featuredMediaUrl = safeMapSearch(map, ["_embedded","wp:featuredmedia",0,"source_url"]);

该函数使用map中提供的键在keys上进行递归迭代,如果缺少键,它将返回null,否则将返回最后一个键的值。 / p>