Есть ли способ создать динамический JsonKey с помощью JsonSerializable в dart, и можем ли мы создать и получить только массив из класса JsonSerializable?

Главный вопрос: как разобрать этот массив json с помощью json_serializable?

  [
  {
    "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 вместо настраиваемого объекта:

  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: Как получить на выходе только массив без ключа: ["Some","People"]

2 ответа

Решение

Чтобы преобразовать модель из JsonArray в String с помощью простого 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"]"

Для класса Custom Model:

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

Это самый простой способ сделать это!

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

JsonSerializable предполагает, что все объекты Map<String, dynamic>. Если вы хотите обрабатывать список на верхнем уровне, сделайте то, что я сделал здесь.

Другие вопросы по тегам