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 в объект сообщения protobuf?

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

вызовов для преобразования с помощью JSON, который выходит из строя.

gson.fromJson(v, classOf[Example]) 

Исключение java.lang.NullPointerException

Я не уверен, если это правильный способ преобразования JSON в генерируемый прото класса. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно или, возможно, предложим какой-то другой метод для этого. Я на protobuf версии 2.6 и не могу переместить до 3 для этого проекта.

ответ

0

Предполагаю, что у вас есть класс Java, сгенерированный для объекта Message. Вы можете использовать приведенный ниже код, если у вас есть Java-класс, сгенерированный для Proto Message в OP.

Приведенный ниже код напишите сообщение 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

Спасибо, но я надеялось получить JSON десериализованный в объект класса Java, созданный для моей Protobuf сообщения. Я бы, вероятно, использовал json-библиотеку спрей вместо gson, если мне все равно нужно преобразовать в промежуточное представление. – user2903819

+0

Не рекомендуется изменять класс proto Java, сгенерированный для добавления аннотации, чтобы указать разные имена атрибутов. Итак, проанализировал json, используя имена атрибутов, и сопоставил его с классом класса PROTO java. – notionquest

 Смежные вопросы

  • Нет связанных вопросов^_^