как сделать общедоступное свойство даже с подчеркиванием в дротике?

Я получаю данные json с сервера api отдыха, и один из его ключей _id и мне нужно сериализовать этот json в объект dart с помощью built_value, но это запрещено, потому что в dart _idявляется частным, а built_value не позволяет мне определять частный получатель в моей модели!
Так что же мне делать?

3 ответа

package:built_valueесть механизм переименования полей. Как упоминалось в README.md:

Соответствующий класс дротиков, использующий built_valueможет выглядеть так. Обратите внимание, что он использует...@BuiltValueField аннотация для сопоставления имени свойства в ответе и имени переменной-члена в Person учебный класс.

  ...

  @nullable
  @BuiltValueField(wireName: 'first_name')
  String get firstName;

Итак, в вашем случае вы должны уметь делать что-то вроде:

@BuiltValueField(wireName: '_id')
String get id;

Я понял! Я могу заменить_id с участием id как это:

  factory User.fromJson(Map<String, dynamic> jsonData) {
    Map<String, dynamic> map = {
      ...jsonData, // add all of jsonData key-value pairs to the map
      'id': jsonData['_id'], // assign the value of _id to id
      '_id': null, // replace _id value with null
    };
    return serializers.deserializeWith(User.serializer, map);
  }

Вы можете заменить'_id'с'id'как только вы получите строку ответа JSON. Затем сериализуйте его.

Класс модели:

      @JsonSerializable(explicitToJson: true)
class PersonModel{
  int id;
  String name;

  PersonModel(this.id,this.name);

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

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

Заменять :

      String responseString = response.body
String newResponseString = responseString.replaceAll('_id', 'id');
PersonModel personModel = PersonModel.fromJson(jsonDecode(newResponseString));

Теперь вы можете использоватьpersonModel.idполучить доступ_idво внешнем интерфейсе.

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