Protobuf JsonFormater.printer конвертировать долго в строку в Json - PullRequest
0 голосов
/ 31 октября 2018

В настоящее время я сталкиваюсь с поведением JsonFormater.printer, печатающим значение long (fixed64) как String в JSON. Есть ли способ / опция, чтобы установить JsonFormater.printer, чтобы не делать это преобразование (Long (fixed64) -> String in 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 (Сгенерирован с помощью protoc 2.6.1)

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

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

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

user_id - это строка в json, но я хочу, чтобы она была целым числом

Спасибо David

1 Ответ

0 голосов
/ 31 октября 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...