Protobuf JsonFormater.printer конвертирует long в String в Json

В настоящее время я сталкиваюсь с поведением JsonFormater.printer, печатающего длинное (fixed64) значение как String в JSON. Есть ли способ / опция, чтобы JsonFormater.printer не выполнял это преобразование (Long (fixed64) -> String в Json)? Json используется приложением Java, поэтому представление fixed64 как целого числа в JSON не должно быть проблемой для Java.

Вот код: В data.proto

syntax = "proto2";
message data{
  required fixed64 user_id = 1;
  required int32 member_id = 2
}

Вот код java, формат файла * .pb.gz

import com.google.protobuf.util.JsonFormat;
.......
//print data in JSON format
final InputStream input = new GZIPInputStream(new FileInputStream(pathToFile));
Message m;
m = defaultMsg.getParserForType().parseDelimitedFrom(input));
String jsonString = JsonFormat.printer().preservingProtoFieldNames().omittingInsignificantWhitespace().print(m);

Сгенерированный класс Java: Data.java (сгенерирован с помощью протокола 2.6.1)

...
private long userId_;
...
private int memberId_;
...

ожидаемый результат: {"user_id":6546585813946021349,member_id":7521}

фактический результат: {"user_id":"6546585813946021349",member_id":7521}

User_id - это String в json, но я хочу, чтобы он был целым числом

Спасибо Дэйвид

какой язык программирования вы здесь имеете в виду? Вы забыли пометить это. И не могли бы вы показать полный код и образец данных, которые можно использовать для воспроизведения проблемы? Спасибо.

ADyson 31.10.2018 10:43

Язык - Java.

user3422290 31.10.2018 15:21

Хорошо спасибо. Теперь не могли бы вы отредактировать свой вопрос, чтобы правильно пометить его, а также предоставить MCVE, который я просил в моем последнем комментарии. Тогда нужным людям будет намного легче увидеть ваш вопрос и легко вам помочь. Спасибо.

ADyson 31.10.2018 15:27

Пример добавлен. Спасибо.

user3422290 31.10.2018 17:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 344
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Судя по исходному коду, похоже, это сделано намеренно. Типы UINT64 и FIXED64 всегда печатаются в двойных кавычках, без вопросов:

https://github.com/protocolbuffers/protobuf/blob/f9d8138376765d229a32635c9209061e4e4aed8c/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java10#L1081-L1081-L

    case INT64:
    case SINT64:
    case SFIXED64:
      generator.print("\"" + ((Long) value).toString() + "\"");

В том же файле несколькими строками выше вы можете видеть, что типы INT32 заключаются в двойные кавычки только в том случае, если они являются ключами на карте (чего, очевидно, нет у вашего прототипа).

Итак, я бы попросил дополнительную информацию о списке рассылки protobuf или, возможно, сообщить об этом как об ошибке / запросе функции.

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