我已经看了很多例子,但我仍然在努力解码下面的json.我是一个新手,我发现json.decode只在我映射为List<dynamic>时才有效.但我相信我最终需要把它映射到List<Map<String, Map<String, dynamic>>.我可能是错的,所以我在寻找输入.我创建了两个模型,ProductLinePartNumber.挑战在于,显示为Product line #的键需要作为值添加到PartNumber对象以及ProductLinename值.这些键可以是任何字符串值,并且不是预先确定的.

    [
      {
        "Product line 1": [
          {
            "partNumber": "160-9013-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9104-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9105-900",
            "orderable": false,
            "description": "Part Number Description"
          }
        ]
      },
      {
        "Product line 2": [
          {
            "partNumber": "160-9113-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9114-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9115-900",
            "orderable": false,
            "description": "Part Number Description"
          }
        ]
      },
      {
        "Product line 3": [
          {
            "partNumber": "160-9205-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9211-900",
            "orderable": true,
            "description": "Part Number Description"
          },
          {
            "partNumber": "160-9212-900",
            "orderable": false,
            "description": "Part Number Description"
          }
        ]
      }
    ]

这是我的ProductLine号和PartNumber号的型号.@JsonSerializable()代码是由Build_Runner自动生成的.

const uuid = Uuid();
    
@JsonSerializable()
class PartNumber {
  PartNumber({
    String? id,
    required this.partNumber,
    required this.orderable,
    required this.description,
    required this.productLine,
  }) : id = id ?? uuid.v4();
    
  final String id;
  final String partNumber;
  final bool   orderable;
  final String description;
  final String productLine;
    
  factory PartNumber.fromJson(Map<String, dynamic> json) =>
      _$PartNumberFromJson(json);
    
  Map<String, dynamic> toJson() => _$PartNumberToJson(this);
 
  PartNumber _$PartNumberFromJson(Map<String, dynamic> json) => PartNumber(
      id: json['id'] as String?,
      partNumber: json['partNumber'] as String,
      orderable: json['orderable'] as bool,
      description: json['description'] as String,
      productLine: json['productLine'] as String,
    );
    
  Map<String, dynamic> _$PartNumberToJson(PartNumber instance) =>
    <String, dynamic>{
      'id': instance.id,
      'partNumber': instance.partNumber,
      'orderable': instance.orderable,
      'description': instance.description,
      'productLine': instance.productLine,
    };
}

@JsonSerializable()
class ProductLine {
  ProductLine({
    String? id,
    required this.name,
    required this.partNumbers,
  }) : id = id ?? uuid.v4();

  final String id;
  final String name;
  final List<PartNumber> partNumbers;

  factory ProductLine.fromJson(Map<String, dynamic> json) =>
      _$ProductLineFromJson(json);

  Map<String, dynamic> toJson() => _$ProductLineToJson(this);

  ProductLine _$ProductLineFromJson(Map<String, dynamic> json) => ProductLine(
      id: json['id'] as String?,
      name: json['name'] as String,
      partNumbers: (json['partNumbers'] as List<dynamic>)
          .map((e) => PartNumber.fromJson(e as Map<String, dynamic>))
          .toList(),
    );

  Map<String, dynamic> _$ProductLineToJson(ProductLine instance) =>
    <String, dynamic>{
      'id': instance.id,
      'name': instance.name,
      'partNumbers': instance.partNumbers,
    };
}

我得到的错误是:

E/flutter (18120): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'String' in type cast E/flutter (18120): #0 _$ProductLineFromJson (package:test_app/models/product_line.g.dart:11:26) E/flutter (18120): #1 new ProductLine.fromJson (package:test_app/models/product_line.dart:24:7) E/flutter (18120): #2 PartNumberManager.formatPartNumbers (package:test_app/managers/part_number_manager.dart:62:39) E/flutter (18120): E/flutter (18120): #3 PartNumberManager.loadPartNumbers (package:test_app/managers/part_number_manager.dart:36:5) E/flutter (18120):

以下是读取json并构建模型的代码.我做错了什么?

class PartNumberManager {
  List<PartNumber>? partNumbers;

  Future<bool> loadPartNumbers() async {
    await formatPartNumbers();
    final partNumbersLoaded = await batchInsertPartNumbers();

    return partNumbersLoaded;
  }

  // Read part_numbers.json file before adding data to the sql database
  Future<List<dynamic>> readJson() async {
    try {
      final String response =
          await rootBundle.loadString('assets/part_numbers.json');
      final data = (json.decode(response) as List<dynamic>);

      return data;
    } catch (error) {
      throw Exception(
          'PartNumberManager, Unexpected error reading JSON: $error');
    }
  }

  Future<void> formatPartNumbers() async {
    List<ProductLine> tmpProductLines = [];

    List<dynamic> data = await readJson();

    for (var i = 0; i < data.length; i++) {
      final productLine = ProductLine.fromJson(data[i]);
      tmpProductLines.add(productLine);
    }

    for (var product in tmpProductLines) {
      for (var pnum in product.partNumbers) {
        final partNumber = PartNumber(
          partNumber: pnum.partNumber,
          orderable: pnum.orderable,
          description: pnum.description,
          productLine: product.name,
        );
        partNumbers!.add(partNumber);
      }
    }
  }
}

推荐答案

class TestCallClass {
  void testFunction() {
    try {
      //print(jsonData);
      List<ProductLine> productLines = ProductLineFromJson(jsonData);
      for (var productLine in productLines) {
        print('Product Line: ${productLine.productLine}');
        for (var product in productLine.products!) {
          print('  Part Number: ${product.partNumber}');
          print('  Orderable: ${product.orderable}');
          print('  Description: ${product.description}');
        }
        print('-------------------');
      }
    } catch (e) {
      print('Error decoding JSON: $e');
    }
  }
}

class Product {
  String? partNumber;
  bool? orderable;
  String? description;

  Product({
    this.partNumber,
    this.orderable,
    this.description,
  });

  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(
      partNumber: json['partNumber'],
      orderable: json['orderable'],
      description: json['description'],
    );
  }
}

List<ProductLine> ProductLineFromJson(dynamic str) => List<ProductLine>.from((str as List<dynamic>).map((x) => ProductLine.fromJson(x)));

class ProductLine {
  String? productLine;
  List<Product>? products;

  ProductLine({
    this.productLine,
    this.products,
  });

  factory ProductLine.fromJson(Map<String, dynamic> json) {
    final List<Product> products = (json[json.keys.first] as List).map((productJson) => Product.fromJson(productJson)).toList();

    return ProductLine(
      productLine: json.keys.first,
      products: products,
    );
  }
}

var jsonData = [
  {
    "Product line 1": [
      {"partNumber": "160-9013-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9104-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9105-900", "orderable": false, "description": "Part Number Description"}
    ]
  },
  {
    "Product line 2": [
      {"partNumber": "160-9113-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9114-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9115-900", "orderable": false, "description": "Part Number Description"}
    ]
  },
  {
    "Product line 3": [
      {"partNumber": "160-9205-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9211-900", "orderable": true, "description": "Part Number Description"},
      {"partNumber": "160-9212-900", "orderable": false, "description": "Part Number Description"}
    ]
  }
];

Json相关问答推荐

Jolt Change将对象添加到数组

如何在JMESPath中区分空和假?

对面的行/列进行排序时可能出现错误

JQ如何获取特定子元素的所有父母

盒子图显示不正确

从Postgres表中的JSON中提取值

JQ:获取该值的较短语法是什么

使用 Powershell,如何将 Azure AD 组成员转换为 Json 对象(文件),然后可以更新?

使用 jq 如何更改键的值?

jq json - 按键名 Select

使用杰克逊解析Kotlin 中的通用密封类

阅读 JSON 正文 Firebase 云函数

在 JSON API Wordpress 上启用 CORS

使用 simplejson 序列化简单类对象的最简单方法?

Spring Security 和 JSON 身份验证

如何安装 json gem - 无法构建 gem 原生扩展(mac 10.10)

Protocol Buffer vs Json - 何时 Select 一个而不是另一个

运算符不存在:json = json

JSON - 是否有任何 XML CDATA 类似功能?

如何在 postgresql 9.3 中循环 JSON 数组