Какой лучший подход к модели с сериализацией JSON для замороженных Union/Sealed Classes, если вы не можете контролировать структуру предоставленного JSON?

Учитывая неизменяемый JSON, вы получаете от сервера вот такое:

      { "name": "someName",
  "fields": [
    { "name": "field1",
      "type": "text",
      "subtype": "autofill",
      "value": "someVal" },
    { "name": "field2",
      "type": "text",
      "subtype": "password",
      "value": "somePass" },
    { "name": "field3",
      "type": "number",
      "subtype": "integer",
      "value": 12 },
    { "name": "field4",
      "type": "number",
      "subtype": "double",
      "value": 3.14 }
  ],
  "etc": "etc"
}

Замороженная модель должна быть примерно такой:

      @freezed
class ExampleSuperclass with _$ExampleSuperclass {
  factory ExampleSuperclass({
    String? name,
    List<Field>? fields,
    String? etc,
  }) = _ExampleSuperclass;

  factory ExampleSuperclass.fromJson(Map<String, dynamic> json) =>
      _$ExampleSuperclassFromJson(json);
}

@Freezed(unionKey: 'type')
class Field with _$Field {
  factory Field({
    String? name,
    String? type,
    String? subtype,
  }) = _Field;

  factory Field.text({
    String? name,
    String? type,
    String? subtype,
  }) = _FieldText;

  factory Field.number({
    String? name,
    String? type,
    String? subtype,
  }) = _FieldNumber;

  factory Field.fromJson(Map<String, dynamic> json) => _$FieldFromJson(json);
}

Но если вы понимаете, что вам нужны как тип, так и подтип, чтобы создать больше подтипов Field.number и Field.text, как вы можете добиться пользовательского fromJson, чтобы это было сделано?

0 ответов

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