如何将json字符串转换为protobuf消息对象?

时间:2016-11-04 06:48:21

标签: json scala gson protocol-buffers

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 String

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

使用失败的json调用转换。

gson.fromJson(v, classOf[Example])

异常 显示java.lang.NullPointerException

我不确定这是否是将json转换为生成的proto类的正确方法。有人可以告诉我我做错了什么,或者建议其他一些方法来实现这一点。我在protobuf版本2.6上,并不能真正移动到这个项目的3。

1 个答案:

答案 0 :(得分: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();

    }