Как преобразовать строку json в объект сообщения protobuf?

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

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

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

gson.fromJson(v, classOf[Example])

Исключение
Ява.ленг.NullPointerException

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

1 ответ

  1. Я предполагаю, что у вас есть класс Java, созданный для объекта сообщения. Вы можете использовать приведенный ниже код, если у вас есть класс Java, созданный для сообщения Proto в 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();
    
        }