有没有办法在 dart 中使用 JsonSerializable 创建 JsonKey 动态,我们可以从 JsonSerializable 类中创建和获取数组吗?

Posted

技术标签:

【中文标题】有没有办法在 dart 中使用 JsonSerializable 创建 JsonKey 动态,我们可以从 JsonSerializable 类中创建和获取数组吗?【英文标题】:Is there any way to create JsonKey dynamic using JsonSerializable in dart and can we create and get only array from the JsonSerializable class? 【发布时间】:2020-07-28 08:50:54 【问题描述】:

主要问题:如何使用 json_serializable 解析这个 json 数组?

  [
  
    "albumId": 1,
    "id": 1,
    "title": "accusamus beatae ad facilis cum similique qui sunt",
    "url": "http://placehold.it/600/92c952",
    "thumbnailUrl": "http://placehold.it/150/92c952"
  ,
  
    "albumId": 1,
    "id": 2,
    "title": "reprehenderit est deserunt velit ipsam",
    "url": "http://placehold.it/600/771796",
    "thumbnailUrl": "http://placehold.it/150/771796"
  ,
  
    "albumId": 1,
    "id": 3,
    "title": "officia porro iure quia iusto qui ipsa ut modi",
    "url": "http://placehold.it/600/24f355",
    "thumbnailUrl": "http://placehold.it/150/24f355"
  
]

使用自定义对象的 StringList inlace 的简单示例:

  import 'package:json_annotation/json_annotation.dart';
  part 'all_json.g.dart';

  @JsonSerializable()
  class AllJsonData 
    @JsonKey(name: 'some_key') // @Question: Can we make this some_key dynamic
    List<String> orders;

    AllJsonData(this.orders);

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

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

all_json.g.dart

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'all_json.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

AllJsonData _$AllJsonDataFromJson(Map<String, dynamic> json) 
  return AllJsonData(
    (json['some_key'] as List)?.map((e) => e as String)?.toList(),
  );


Map<String, dynamic> _$AllJsonDataToJson(AllJsonData instance) =>
    <String, dynamic>
      'some_key': instance.orders,
    ;

@Question1:我们可以让这个 some_key 动态吗? 制作对象并反序列化后,它会给出这样的结果。

    AllJsonData allJsonData = AllJsonData(['Some', 'People']);
    String vv = jsonEncode(allJsonData.toJson());
    print(vv);

    // Getting output like:
    ""education":["Some","People"]"

    // Required Output only array without key:
    ["Some","People"]

@Question2:如何获得像没有键的数组一样的输出: [“一些”,“人”]

【问题讨论】:

【参考方案1】:

这是最简单的方法!

final list = (jsonDecode(text) as List).map((e) => Album.fromJson(e)).toList()

JsonSerializable 假定所有对象都是Map&lt;String, dynamic&gt;。如果您想在顶层处理列表,请执行我在此处所做的操作。

【讨论】:

请说得更清楚。错误:类型“_InternalLinkedHashMap”不是类型转换中“List”类型的子类型 我尝试了基本的类似:AllJsonData allJsonData = AllJsonData( ['Some', 'People']);字符串 vv = jsonEncode(allJsonData.toJson()); var tt = (jsonDecode(vv) as List) .map((e) => AllJsonData.fromJson(e)) .toList(); 请把问题1和问题2也做一遍。【参考方案2】:

使用简单的 String[] 将模型从 JsonArray 转换为 String。

        AllJsonData allJsonData = AllJsonData(
          orders: ['James', 'Bipin', 'Simon'],
        );
        String jsonObjectAsString = jsonEncode(allJsonData.toJson());
        var parentMap = jsonDecode(jsonObjectAsString);

        // @read: To convert as JsonString
        var jsonString = jsonEncode(parentMap['orders'],
            toEncodable: (e) => e.toString());
        print(jsonObjectAsString); 
       // gives result like "["James","Bipin","Simon"]"

对于自定义模型类:

        AllJsonData allJsonData = AllJsonData(
          education: edu,
        );
        String jsonObjectAsString = jsonEncode(allJsonData.toJson());
        var parentMap = jsonDecode(jsonObjectAsString);
        var subParentMap = parentMap['education'];
        List<dynamic> mList = subParentMap['modelList'];
        // mapping as model-list
        var modelList =
            mList.map((e) => ExpPopupModel.fromJson(e)).toList();
        // convert into json-string
        var jsonString = jsonEncode(subParentMap['modelList'],
            toEncodable: (e) => e.toString());
        print(jsonObjectAsString);

【讨论】:

以上是关于有没有办法在 dart 中使用 JsonSerializable 创建 JsonKey 动态,我们可以从 JsonSerializable 类中创建和获取数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用完整的 Dart SDK

Dart StreamController 有两个参数

有没有办法将生成的文件放在一个单独的文件夹中?

Flutter/Dart datamatrix 扫码库

在 Polymer.dart 中定义全局过滤器/变压器

为了清楚起见,我想在 Dart 中使用命名参数。我应该如何处理它们?