флаттер json_serializable tojson не работает должным образом - PullRequest
0 голосов
/ 24 ноября 2018

Я изучаю пример класса Order и обнаружил, что класс Item не преобразован в Map.

class Order {
  int count;
  int itemNumber;
  bool isRushed;
  Item item; 
  Map<String, dynamic> toJson() => _$OrderToJson(this);
}

Сгенерированный файл .g имеет следующее:

Map<String, dynamic> _$OrderToJson(Order instance) {
  ...
  writeNotNull('item', instance.item);
  ...
  return val;
}

Элемент в карте заказа по-прежнему относится к типу Элемента, но я ожидаю, что он будет автоматически преобразован в Карту.сгенерированный файл .g должен иметь что-то вроде этого

writeNotNull('item', instance.item.toJson());

Я не хочу добавлять это вручную, поскольку он будет перезаписан при регенерации .g файла.Почему библиотека json_serializable не делает такую ​​простую вещь или я что-то упускаю?спасибо.

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Теперь я нашел решение, просто установите его в build.yaml

licit_to_json = true.

и заново создайте файл .g.Теперь он должен преобразовать его в карту для вас.

0 голосов
/ 11 мая 2019

Для firebase вам понадобится опция any_map, так как карты из firebase <dynamic, dynamic>, в противном случае он будет ожидать <String, dynamic>

Создайте этот файл как build.yaml в корне вашего флаттерапроект, он не существует по умолчанию.

targets:
  $default:
    builders:
      json_serializable:
        options:
          any_map: true
          explicit_to_json: true
0 голосов
/ 24 ноября 2018

json.encode(...) попытается найти метод toJson() в классе Item и правильно сериализовать элемент.Для сгенерированной логики сериализации нет необходимости вызывать toJson().

. Нужно просто убедиться, что класс Item также помечен @JsonSerializable() и реализует toJson().


Кроме того, вы никогда не вызовете toJson() вручную, вместо этого вы передадите объект заказа в json.encode(...)

...