检查 json 数组中是否存在 key

Isl*_*LBI 2 json dart flutter

我有一个服务返回一个 json 数组,该数组解析并映射到我创建的对象的列表中。问题是我有一个名为“productName”的键,当它不包含值时,它不会随 json 响应一起返回。我想要做的是解析 json 数组,并针对数组中的每个项目测试键是否存在,如果存在,我应该返回键的值,如果不存在,我将默认值返回到字段 ProductName I已在我的模型中创建。

这是我的服务:

Future<List<Qrqc>?> fetchMyQrqc(
      {required String baseUrl, required String id}) async {
    try {
      http.Response response = await http.get(
        Uri.parse(
            "https://demo.app.deepnrise.com/api-qrqc/qrqc/v1/qrqc/myqrqc/?userId=b0862e0e-ffe7-48c5-8f3c-3307b7f0671e&page=1&pageSize=1000000"),
        headers: {HttpHeaders.contentTypeHeader: 'application/json'},
      );

      if (response.statusCode == 200) {
        var codeUnits = response.body.codeUnits;
        var responseParsed = const Utf8Decoder().convert(codeUnits);
        List<Qrqc> myQRQC = (json.decode(responseParsed) as List)
            .map((data) => Qrqc.fromJson(data))
            .toList();

        debugPrint("List Qrqc fetched with success");

        return myQRQC;
      } else {
        throw Exception('Failed to load qrqc');
      }
    } catch (ex) {
      debugPrint(ex.toString());
    }
  }


Run Code Online (Sandbox Code Playgroud)

这是我的模型:

import 'dart:convert';

Qrqc qrqc(String str) => Qrqc.fromJson(json.decode(str));

class Qrqc {
  // ignore: non_constant_identifier_names
  Qrqc(
      {required this.id,
      this.title,
      this.progress,
      this.status,
      this.role,
      this.createdAt,
      this.perimeterName,
      this.typeID, this.productName});
  // ignore: non_constant_identifier_names
  int id;
  String? title;
  int? progress;
  String? role;
  String? status;
  String? typeID;
  String? createdAt;
  String? perimeterName;
  String? productName;
  String? typeName;

  factory Qrqc.fromJson(Map<String, dynamic> json) {
    return Qrqc(
      id: json['id'],
      progress: json["progress"],
      role: json["role"],
      status: json["status"],
      title: json["title"],
      createdAt: json["detectedAt"],
      perimeterName: json["perimeterName"],
      typeID: json["typeID"],
      productName: json["productName"],
    );
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = id;
    data['progress'] = progress;
    data['role'] = role;
    data['status'] = status;
    data['perimeterName'] = perimeterName;
    data['detectedAt'] = createdAt;
    data['typeID'] = title;
    data['productName'] =  productName;
    return data;
  }
}
 



Run Code Online (Sandbox Code Playgroud)

目前,该服务返回 null 异常,因为正如我所说,json 数组中的某些项目包含密钥,而其他项目则不包含。我希望能够将该字段保留在我的模型中,解析 json 数组并测试每个项目是否包含该键。我知道 dart containsKey 中有一个方法,但我不知道在哪里或如何在 json 数组上使用它,而不是简单的 json 模型。如果有人可以帮助我,我将不胜感激。

小智 5

您可以使用??带有默认值的运算符对 json 字段进行简单的 null 检查。使用它就像

productName: json["productName"] ?? 'Default Product Name';
Run Code Online (Sandbox Code Playgroud)

Default Product Name如果 JSON 字段为 null,则应自动设置默认值。

它本质上是一个简写

productName: json["productName"] != null ? json["productName"] : 'Default Product Name';
Run Code Online (Sandbox Code Playgroud)