2016-11-04 1 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 StringWie konvertiere ich JSON-String zu Protobuf-Nachrichtenobjekt?

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

Anruf mit JSON zu konvertieren, die fehlschlägt.

gson.fromJson(v, classOf[Example]) 

Exception java.lang.NullPointerException

Ich bin nicht sicher, ob dies json generierte Proto Klasse der Umwandlung ein richtiger Weg ist. Könnte mir bitte jemand sagen, was ich falsch mache oder vielleicht eine andere Methode vorschlage, um das zu erreichen? Ich bin auf Protobuf Version 2.6 und kann nicht wirklich bis zu 3 für dieses Projekt bewegen.

Antwort

0

Ich nehme an, Sie haben die Java-Klasse für Message-Objekt generiert. Sie können den folgenden Code verwenden, wenn Sie die Java-Klasse für Proto-Nachricht in OP generiert haben.

Der folgende Code schreibt die PROTO-Nachricht in die Datei. Sie können das kommentieren, wenn Sie es nicht brauchen.

-Code zu konvertieren JSON Nachrichtenobjekt protobuf und schreiben in Datei: -

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

Danke, aber ich hatte gehofft, json in Objekt der Java-Klasse für meine protobuf Nachricht erzeugt deserialisiert zu erhalten. Ich würde wahrscheinlich die JSON-Bibliothek von Spray anstelle von Gson verwenden, wenn ich sowieso zur Zwischendarstellung konvertieren müsste. – user2903819

+0

Es ist nicht ratsam, die generierte Proto-Java-Klasse zu ändern, um Anmerkungen hinzuzufügen, um verschiedene Attributnamen zu erwähnen. Also, analysierte den JSON unter Verwendung von Attributnamen und ordnete ihn der PROTO-Java-Klasse zu. – notionquest

Verwandte Themen