Protobuf JsonFormater.printer将long转换为Json中的String

4

目前我遇到了JsonFormater.printer将long(fixed64)值作为字符串打印在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}

在json中,user_id是字符串,但我希望它是整数。

谢谢 David


你所指的编程语言是什么?你忘了标记它。可以给我展示一个完整的代码和数据样本,以便能够重现这个问题吗?谢谢。 - ADyson
这是Java编程语言。 - user3422290
好的,谢谢。现在你能否编辑你的问题并正确标记它,同时提供我在上一条评论中要求的 MCVE。这样,合适的人就可以更容易地看到你的问题,并能够轻松地帮助你。谢谢。 - ADyson
示例已添加。谢谢。 - user3422290
1个回答

4
根据源代码,这似乎是设计上的特点。无论如何,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 邮件列表中寻求更多信息,或者将其报告为 bug/功能请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接