Protobuf JsonFormater.printer在Json中长时间转换为String

时间:2018-10-31 09:27:30

标签: java json protocol-buffers

当前,我遇到JsonFormater.printer的行为,将long(fixed64)值打印为JSON中的String。 有没有什么方法/选项可以设置JsonFormater.printer不执行此转换(Json中的Long(fixed64)-> String)? Json由Java应用程序使用,在Java中将fixed64表示为JSON中的整数应该不是问题。

这是代码: 在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是json中的String,但我希望将其作为整数

谢谢 大卫

1 个答案:

答案 0 :(得分:0)

根据源代码,这似乎是设计使然。 UINT64FIXED64类型始终用双引号打印出来,没有问题:

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邮件列表中寻求更多信息,或者将其报告为错误/功能请求。