json.decode 后的空检查

And*_*rew 3 dart flutter

有没有办法快速检查解码的 JSON 对象中的空条目?

例如:

final responseJson = json.decode(response.body);
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容:

responseJson['result']['mydata']['account'] = 'Joe Doe';
Run Code Online (Sandbox Code Playgroud)

为了检查“mydata”部分是否不为空,我必须执行以下操作:

if(responseJson != null)
        {
           if(responseJson['result'] != null)
              {

                 if(responseJson['result']['mydata'] != null)
...
Run Code Online (Sandbox Code Playgroud)

这真的很丑。如何做到这一点:

if((responseJson != null) && (responseJson['result'] != null) && (responseJson['result']['mydata'] != null))
{
}
Run Code Online (Sandbox Code Playgroud)

在 Dart 中,如果某些中间项为空(即 ['result']),则会出现异常。

有空感知运算符,例如:

obj?.method()
Run Code Online (Sandbox Code Playgroud)

但是如何将它们与解码的 JSON 映射对象一起使用?

Gün*_*uer 5

如果你想设置一个值

responseJson['result']['mydata']['account'] = 'Joe Doe';
Run Code Online (Sandbox Code Playgroud)

这可能对你有用

data.putIfAbsent('result', () => {})
    .putIfAbsent('mydata', () => {})
    .putIfAbsent('account', () => 'John Doe');
Run Code Online (Sandbox Code Playgroud)

对于阅读,您可以使用

  if(data.containsKey('result') && data['result'].containsKey('mydata')) {
    data['result']['mydata']['account'] = 'Joe Doe';
  } else {
    print('empty');
  }
Run Code Online (Sandbox Code Playgroud)


Rém*_*let 5

您应该做的是将其转换为 Dart 类,而不是直接使用 JSON 对象。然后使用空感知运算符。

final response = new Response.fromJSON(json.decode(''));

if (response?.result?.myData != null) {

}
Run Code Online (Sandbox Code Playgroud)

您可以使用或生成fromJSON类构造函数。json_serializablebuilt_value

或者您可以手动编写它们:

class Data {
  String account;

  Data.fromJSON(Map json) {
    if (json.containsKey('myData')) {
      account = json['myData'];
    }
  }
}

class Result {
  Data myData;

  Result({this.myData});

  Result.fromJSON(Map json) {
    if (json.containsKey('myData')) {
      myData = json['myData'];
    }
  }
}

class Response {
  Result result;

  Response({this.result});

  Response.fromJSON(Map json) {
    if (json.containsKey('result')) {
      result = json['result'];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)