Как десериализовать JSON с помощью динамических ключей в dart

#android-studio #flutter #dart #json-deserialization

#android-studio #флаттер #dart #json-десериализация

Вопрос:

Ниже приведен ответ API, который у меня есть

 {
  "19ca14e7ea6328a42e0eb13d585e4c22":{
    "key":"19ca14e7ea6328a42e0eb13d585e4c22",
    "product_id":36,
    "variation_id":0,
    "variation":[],
    "quantity":1,
    "data_hash":"b5c1d5ca8bae6d4896cf1807cdf763f0",
    "line_tax_data": {
      "subtotal": {
        "12": 8.4
      },
      "total": {
        "12": 8.4
      }
    },
    "line_subtotal":18,
    "line_subtotal_tax":8.4,
    "line_total":14.4,
    "line_tax":8.4,
    "data":{},
    "product_name":"Vneck Tshirt",
    "product_title":"Vneck Tshirt",
    "product_price": "£18",
    "product_image":"https://example.com/wp-content/uploads/2019/06/vneck-tee.jpg"
  }
}
 

Ниже приведен десериализованный объект, который у меня есть.

 import 'dart:convert';

AddToCartResponseModel addToCartResponseModelFromJson(String str) => AddToCartResponseModel.fromJson(json.decode(str));

String addToCartResponseModelToJson(AddToCartResponseModel data) => json.encode(data.toJson());

class AddToCartResponseModel {
    AddToCartResponseModel({
        this.the19Ca14E7Ea6328A42E0Eb13D585E4C22,
    });

    The19Ca14E7Ea6328A42E0Eb13D585E4C22 the19Ca14E7Ea6328A42E0Eb13D585E4C22;

    factory AddToCartResponseModel.fromJson(Map<String, dynamic> json) => AddToCartResponseModel(
        the19Ca14E7Ea6328A42E0Eb13D585E4C22: The19Ca14E7Ea6328A42E0Eb13D585E4C22.fromJson(json["19ca14e7ea6328a42e0eb13d585e4c22"]),
    );

    Map<String, dynamic> toJson() => {
        "19ca14e7ea6328a42e0eb13d585e4c22": the19Ca14E7Ea6328A42E0Eb13D585E4C22.toJson(),
    };
}

class The19Ca14E7Ea6328A42E0Eb13D585E4C22 {
    The19Ca14E7Ea6328A42E0Eb13D585E4C22({
        this.key,
        this.productId,
        this.variationId,
        this.variation,
        this.quantity,
        this.dataHash,
        this.lineTaxData,
        this.lineSubtotal,
        this.lineSubtotalTax,
        this.lineTotal,
        this.lineTax,
        this.data,
        this.productName,
        this.productTitle,
        this.productPrice,
        this.productImage,
    });

    String key;
    int productId;
    int variationId;
    List<dynamic> variation;
    int quantity;
    String dataHash;
    LineTaxData lineTaxData;
    int lineSubtotal;
    double lineSubtotalTax;
    double lineTotal;
    double lineTax;
    Data data;
    String productName;
    String productTitle;
    String productPrice;
    String productImage;

    factory The19Ca14E7Ea6328A42E0Eb13D585E4C22.fromJson(Map<String, dynamic> json) => The19Ca14E7Ea6328A42E0Eb13D585E4C22(
        key: json["key"],
        productId: json["product_id"],
        variationId: json["variation_id"],
        variation: List<dynamic>.from(json["variation"].map((x) => x)),
        quantity: json["quantity"],
        dataHash: json["data_hash"],
        lineTaxData: LineTaxData.fromJson(json["line_tax_data"]),
        lineSubtotal: json["line_subtotal"],
        lineSubtotalTax: json["line_subtotal_tax"].toDouble(),
        lineTotal: json["line_total"].toDouble(),
        lineTax: json["line_tax"].toDouble(),
        data: Data.fromJson(json["data"]),
        productName: json["product_name"],
        productTitle: json["product_title"],
        productPrice: json["product_price"],
        productImage: json["product_image"],
    );

    Map<String, dynamic> toJson() => {
        "key": key,
        "product_id": productId,
        "variation_id": variationId,
        "variation": List<dynamic>.from(variation.map((x) => x)),
        "quantity": quantity,
        "data_hash": dataHash,
        "line_tax_data": lineTaxData.toJson(),
        "line_subtotal": lineSubtotal,
        "line_subtotal_tax": lineSubtotalTax,
        "line_total": lineTotal,
        "line_tax": lineTax,
        "data": data.toJson(),
        "product_name": productName,
        "product_title": productTitle,
        "product_price": productPrice,
        "product_image": productImage,
    };
}

class Data {
    Data();

    factory Data.fromJson(Map<String, dynamic> json) => Data(
    );

    Map<String, dynamic> toJson() => {
    };
}

class LineTaxData {
    LineTaxData({
        this.subtotal,
        this.total,
    });

    Total subtotal;
    Total total;

    factory LineTaxData.fromJson(Map<String, dynamic> json) => LineTaxData(
        subtotal: Total.fromJson(json["subtotal"]),
        total: Total.fromJson(json["total"]),
    );

    Map<String, dynamic> toJson() => {
        "subtotal": subtotal.toJson(),
        "total": total.toJson(),
    };
}

class Total {
    Total({
        this.the12,
    });

    double the12;

    factory Total.fromJson(Map<String, dynamic> json) => Total(
        the12: json["12"].toDouble(),
    );

    Map<String, dynamic> toJson() => {
        "12": the12,
    };
}
 

Как правильно десериализовать это. Поскольку ключи здесь динамические.

Комментарии:

1. вы можете определить ключи как dynamic или Object

Ответ №1:

когда вы декодируете json с jsonDecode помощью, в итоге у вас будут точные типы, пара ключ-значение "key":2 при декодировании key.runTimeType будет String , value.runTimeType будет int , независимо от того, насколько глубоко они вложены, поэтому вы можете назначить их как var k=key as String вложенные, так и var v=value as int вложенные Map и List поддерживаются

Комментарии:

1. Спасибо за ответ. Я попробую ваше решение.