2017-02-17 183 views
0

我想将json转换为proto消息对象,但是如果在json中有一些 字符,如$或。或_我得到一个InvalidProtocolBufferException。 我原:protobuf3 JsonFormat 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

能否请您补充问题JSON和protobuf的定义类型用户的? –

+0

我已经完成了,请检查 – idmitriev

回答

0

在我看来你的问题是在原definiton C型的声明连接,它里面你有map<string,bytes> d = 1;在Java端将是:Map<String, ByteString>而在你的Json中,你有一些“看起来像”字符串字符串映射。

让我们做快速的实验,并尝试在你的主要类型转换成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地图或者编码值(或使用的protobuf转换成JSON),或更改protobuf的声明

+0

谢谢Michal,我认为你是这样的,我认为在这种情况下使用JsonFormat从json转换为proto是不可能的。我只是想将java.lang.Object映射到proto消息。我有一个Map 数据的数据对象,我需要使用protobuf发送它。 – idmitriev

+0

在我看来,如果没有额外的json处理(在发送方),或者没有改变原始定义,它将不可能实现。有可能在你的情况下,在发件人端,你也可以使用protobuf来序列化为json? –

+0

是的,在两边我使用protobuf。无论如何,我可以做到,但我还没有正确的方式。现在我决定把它映射为map ,因为我从那里得到了答案 - http://stackoverflow.com/questions/41878400/how-to-map-java-lang-object-in-proto-file -protobuf – idmitriev