2016-11-04 3 views
0
message Example { 
    enum State { 
     Deleted = 1; 
     Inactive = 2; 
     Active = 4; 
    } 

    optional uint64 id      = 1  [(gson_name) = "id"]; 
    optional uint64 state     = 2  [(gson_name) = "state"]; 
    optional uint64 userId     = 3  [(gson_name) = "uui"]; 
    optional sint32 marketId     = 4  [(gson_name) = "m"]; 
    optional uint64 productId    = 5  [(gson_name) = "p"]; 
} 

JSON 문자열json string을 protobuf 메시지 객체로 변환하려면 어떻게해야합니까?

v: String = {"m": 97, "state": 1, "uui": 1, "id": 1, "p": 1} 

호출이 실패 JSON을 사용하여 변환합니다.

gson.fromJson(v, classOf[Example]) 

예외 java.lang.NullPointerException이

이 생성 프로토 클래스에 JSON 변환하는 올바른 방법 인 경우 I는 확실하지 않다. 누군가 내가 잘못하고 있는지, 아니면 이것을 달성하기 위해 다른 방법을 제안 해 주시겠습니까? 나는 protobuf 버전 2.6에 있고 정말로이 프로젝트를 위해 3까지 움직일 수 없다.

답변

0

Message 객체에 대해 생성 된 Java 클래스가 있다고 가정합니다. OP에서 Proto Message에 대해 Java 클래스를 생성 한 경우 아래 코드를 사용할 수 있습니다.

아래 코드는 PROTO 메시지를 파일에 씁니다. 필요없는 경우 댓글을 달 수 있습니다.

코드는 JSON 메시지 객체를 protobuf 및 파일에 쓸로 변환 : -

public static void main(String[] args) throws IOException { 

     String jsonString = "{\"m\": 97, \"state\": 1, \"uui\": 1, \"id\": 1, \"p\": 1}"; 

     Gson gson = new GsonBuilder().create(); 
     JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class); 

     ExampleProto.Example.Builder example = ExampleProto.Example.newBuilder();  
     example.setId(jsonObject.get("id").getAsLong()); 
     example.setMarketId(jsonObject.get("m").getAsInt()); 
     example.setProductId(jsonObject.get("p").getAsInt()); 
     example.setState(jsonObject.get("state").getAsInt()); 
     example.setUserId(jsonObject.get("uui").getAsInt()); 

     System.out.println(example.build()); 

     FileOutputStream output = new FileOutputStream(new File("proto.txt")); 
     example.build().writeTo(output); 
     output.close(); 

    } 
+0

감사하지만 난 내 protobuf 메시지를 생성 된 자바 클래스의 객체로 역 직렬화 JSON을 얻을 기대했다. 어쨌든 중간 표현으로 변환해야한다면 아마 gson 대신에 스프레이의 json 라이브러리를 사용할 것입니다. – user2903819

+0

주석을 추가하기 위해 생성 된 proto Java 클래스를 변경하여 다른 속성 이름을 언급하는 것은 바람직하지 않습니다. 그래서 속성 이름을 사용하여 json을 구문 분석하고 PROTO java 클래스에 매핑했습니다. – notionquest

관련 문제