Сериализация встроенного значения во флаттере - PullRequest
0 голосов
/ 20 сентября 2018

Я использую объект JSON в своем приложении.Я сериализирую данные, используя BuiltValue и json.decode ().Проблема в том, что JSON является вложенным и сталкивается с проблемами, решающими правильное значение для использования встроенного значения во вложенном json.Я пробовал читать документацию, но не смог найти сильно вложенный пример.Вот мой json и мой класс, я также предоставляю тестовый пример с выводом для дальнейшего понимания.

    import 'package:built_value/built_value.dart';
    import 'package:built_value/serializer.dart';
    import 'package:built_collection/built_collection.dart';

    part 'widget_model.g.dart';

    abstract class WidgetModel implements Built<WidgetModel, WidgetModelBuilder>{

      ObjectList get formObject;

      WidgetModel._();
      static Serializer<WidgetModel> get serializer => _$widgetModelSerializer;
      factory WidgetModel([updates(WidgetModelBuilder b)]) = _$WidgetModel;

    }

    abstract class ObjectList implements Built<ObjectList, ObjectListBuilder>{

      ElementList get listOfElements;

      ObjectList._();
      static Serializer<ObjectList> get serializer => _$objectListSerializer;
      factory ObjectList([updates(ObjectListBuilder b)]) = _$ObjectList;
    }

    abstract class ElementList implements Built<ElementList, ElementListBuilder>{

      BuiltList<FormObject> get elements;

      ElementList._();
      static Serializer<ElementList> get serializer => _$elementListSerializer;
      factory ElementList([updates(ElementListBuilder b)]) = _$ElementList;


    }

    abstract class ReferenceData implements Built<ReferenceData, ReferenceDataBuilder>{

      String get value;
      String get key;

      ReferenceData._();
      static Serializer<ReferenceData> get serializer => _$referenceDataSerializer;
      factory ReferenceData([updates(ReferenceDataBuilder b)]) = _$ReferenceData;


    }

    abstract class FormObject implements Built<FormObject, FormObjectBuilder> {


      @BuiltValueField(wireName: 'textAlign')
      String get textAlign;

      @BuiltValueField(wireName:'references')
       BuiltList<ReferenceData> get references;

      FormObject._();
      static Serializer<FormObject> get serializer => _$formObjectSerializer;
      factory FormObject([updates(FormObjectBuilder b)]) = _$FormObject;
    }

Мой файл сериализатора:

import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'package:stepper/src/model/widget_model.dart';


part 'serializers.g.dart';

@SerializersFor([WidgetModel])
final Serializers serializers =
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

Вот мой тестовый пример:

import 'dart:convert';

import 'package:stepper/src/model/serializers.dart';
import 'package:stepper/src/model/widget_model.dart';
import 'package:test/test.dart';

main() {
  String formObjectString = """{
      "FORMOBJECT": {
      "elements" : [{
        "textAlign": "left",
        "references": [{
                "value": "2018",
                "key": "year"
            }]
      }]
     }
   }""";


  group('test form object', (){
    test('test', () {
      ObjectList formObject = serializers.deserializeWith(ObjectList.serializer, json.decode(formObjectString));
      print(formObject);
    });
  });
}

Вот вывод (напечатанный formObject):

ObjectList {
  listOfElements=ElementList {
    elements=[],
  },
}

Проблема в том, что список элементов пуст.Это странно, потому что я уверен, что мои элементы сериализованы.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю

@SerializersFor([WidgetModel])

должно быть

@SerializersFor([WidgetModel, ObjectList, ElementList, ReferenceData, FormObject])
...