我正在尝试将json转换为proto消息对象,但如果有一些 json中的字符,如$或。或_我得到一个InvalidProtocolBufferException。 我的原型:
syntax = "proto3";
package messages;
option java_multiple_files = true;
message Main {
A a = 1;
}
message A {
repeated B b = 1;
}
message B {
repeated C c = 1;
}
message C {
map<string, bytes> d = 1;
}
Java代码:
String json = "{\n" +
" \"a\" : {\n" +
" \"b\" : [ {\n" +
" \"c\" : [ {\n" +
" \"d\" : {\n" +
" \"money\" : [ \"100$\" ]\n" +
" }\n" +
" } ]\n" +
" } ]\n" +
" }\n" +
"}";
Main.Builder builder = Main.newBuilder();
JsonFormat.parser().merge(json, builder);
System.out.println(builder.build());
输出:
com.google.protobuf.InvalidProtocolBufferException: com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: $
at com.google.protobuf.util.JsonFormat$ParserImpl.merge(JsonFormat.java:1065)
at com.google.protobuf.util.JsonFormat$Parser.merge(JsonFormat.java:273)
答案 0 :(得分:0)
在我看来,你的问题与C语言的声明有关,在proto definiton中你有map<string,bytes> d = 1;
在Java方面将是:Map<String, ByteString>
在你的Json你有一些东西“看起来像“String-String map”。
让我们快速进行实验并尝试将您的Main类型转换为json:
Main main = Main.newBuilder().setA(
A.newBuilder().addB(
B.newBuilder().addC(
C.newBuilder().putD("money",
ByteString.copyFrom("100$".getBytes()))
)
)
).build();
System.out.println(JsonFormat.printer().print(main));
输出
{
"a": {
"b": [{
"c": [{
"d": {
"money": "MTAwJA=="
}
}]
}]
}
}
正如您所看到的,我们没有100$
但编码版本MTAwJA==
,如果您尝试使用protobuf将此json转换为对象,则不会出现错误。
所以在我看来 - 在转换为json期间对你的d map中的值进行编码(或使用protobuf转换为json),或者更改protobuf声明