2017-02-17 11 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; 
} 

자바 코드 :

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

을 protobuf 변경? –

+0

나는 그것을 완료했다. – idmitriev

답변

0

문제가 프로토 definiton에서의 내부에, C 형의 선언으로 연결하면 map<string,bytes> d = 1; Java 측에서 다음 중 어느 것이 될 것입니까 : Map<String, ByteString> 그리고 Json에는 "String-String map"처럼 보이는 것이 있습니다.

의 빠른 실험을하자 JSON으로 자신의 메인 유형을 변환하려고 : 당신은 우리가 100$이없는 볼 수 있듯이

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==" 
     } 
     }] 
    }] 
    } 
} 

될 것입니다하지만 버전 MTAwJA== 인코딩 protobuf를 사용하여이 json을 객체로 변환하려고 시도하면 오류가 발생하지 않습니다. 내 의견으로는 그래서

- JSON으로 변환 중에 D 맵 중 하나 인 코드 값 (또는 protobuf를 사용하여 JSON 변환), 또는 문제가 JSON과 protobuf 정의 유형 사용자의 추가 시겠어요 선언

+0

감사한다. Michal, 나는 너를 얻었다. JsonFormat을이 경우 사용하여 json에서 proto로 변환하는 것은 불가능하다고 생각한다. java.lang.Object를 proto 메시지에 매핑하고 싶습니다. Map 데이터가있는 데이터 객체가 있고 protobuf를 사용하여 데이터를 보내야합니다. – idmitriev

+0

제 생각에 json을 추가로 처리하지 않고 (발신자 쪽에서) 또는 proto 정의에서 변경하지 않고도 가능하지 않습니다. 가능한 경우 귀하의 경우, 발신자 측에서 protobuf를 사용하여 json으로 일련화할 수도 있습니다. –

+0

예, 양쪽에 protobuf를 사용합니다. 어쨌든 할 수는 있지만 아직 올바른 방법을 알지 못했습니다. 이제지도에서 으로 매핑하기로 결정했습니다. 거기에서 대답을 얻었습니다. http://stackoverflow.com/questions/41878400/how-to-map-java-lang-object-in-proto-file -protobuf – idmitriev