Преобразование всех ключей и значений карты в строку в Dart

Проблема, с которой я столкнулся, связана с сериализацией и декодированием JSON. Я пытаюсь сериализовать сообщение Protobuf, чтобы использовать его с сохранением redux.

Это метод, который я вызываю для сериализации моего объекта:

  Map<String, dynamic> toJSON(){

    return <String, dynamic>{
        'isLogged': this.isLogged,
        'isExpired': this.isExpired,
        'protoUser':
            this.protoUser == null ? null : this.protoUser.writeToJsonMap()),
        'error': this.error,
      }
  };

и это метод, который я использую для чтения сохраненного состояния:

  factory AuthState.fromJSON(Map<String, dynamic> json){
    new AuthState(
      isLogged: json['isLogged'],
      isExpired: json['isExpired'],
      error: json['error'],
      protoUser: json['protoUser'] == null
          ? null
          : new Auth.fromJson(json['protoUser'].toString()),
    );
  }

У меня проблема в том, что writeToJsonMap не записывает действительную карту JSON для dart. Поэтому при чтении сериализованного состояния я получаю эту ошибку:

E/flutter (24643): FormatException: Unexpected character (at character 2)
E/flutter (24643): {1: 200, 2: test1, 3: test2, 4: {1: 1, 3: Mike, 4: tester}}

тоже спрашивал на https://github.com/dart-lang/protobuf/issues/136

Что это значит при чтении сериализованного состояния?

Günter Zöchbauer 25.10.2018 17:21

redux persist - это пакет для сохранения хранилища redux, которое содержит состояние приложения. Я имею в виду при чтении сериализованного файла.

M20 25.10.2018 17:25

Вы делаете что-то не так, но, вероятно, это что-то в коде, не включенное в ваш вопрос.

Günter Zöchbauer 25.10.2018 17:29

он похож на github.com/FranPitri/flutter_redux_boilerplate ... с той лишь разницей, что вместо использования модели User я использовал объект protobuf.

M20 25.10.2018 17:36

и все работает, если я удалю protoUser (где кодирование / декодирование json неправильное)

M20 25.10.2018 17:59

Это похоже на кодировку JSON для транспорта protobuf, а не для пользовательского использования. Protobuf использует числовые индексы полей для экономии места.

Günter Zöchbauer 25.10.2018 18:27

Собственно, я пытаюсь найти способ решения этой проблемы.

M20 25.10.2018 18:30
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
3
7
2 870
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время существует запрос на включение имен полей. https://github.com/dart-lang/protobuf/pull/83

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