2

I have a service that returns a json array which parse and map into a list of an object that I have created . The problem is that I have a key called "productName" which is not returned with json response when it doesn't contain a value. What I what I want to do is parse the json array and for every item in the array test if the key is there or not , if so I should return the value of the key if not I return a default value to the field productName I have created in my model .

This is my service :

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());
    }
  }


This is my model :

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;
  }
}
 



For now the service is returning a null exception because as I said some items in the json array contain the key while others don't . I want to be able to keep the field in my model , parse the json array and test if every item contain the key or not . I know there's a method in dart containsKey but I didn't know where or how to use it on json array not a simple model of json. If anyone can help I'd be grateful .

1 Answer 1

5

You can use a simple null check on the json fields using the ?? operator with a default. Use it like

productName: json["productName"] ?? 'Default Product Name';

That should automatically set the default value Default Product Name if the JSON field is null.

It's essentially a short hand for

productName: json["productName"] != null ? json["productName"] : 'Default Product Name';
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.