0

我一直在尝试使用 gson 从 json 字符串生成协议缓冲区消息。有谁知道如果可以做到这一点?

我已经尝试过:

Gson gson = new Gson();
Type type = new TypeToken<List<PROTOBUFFMESSAGE.Builder>>() {}.getType();
List<PROTOBUFFMESSAGE.Builder> list = (List<PROTOBUFFMESSAGE.Builder>) gson.fromJson(aJsonString, type);

Gson gson = new Gson();
Type type = new TypeToken<List<PROTOBUFFMESSAGE>>() {}.getType();
List<PROTOBUFFMESSAGE> list = (List<PROTOBUFFMESSAGE>) gson.fromJson(aJsonString, type);

json 中的消息使用与协议缓冲区中相同的名称,即:

message PROTOBUFFMESSAGE {
   optional string this_is_a_message = 1;
   repeated string this_is_a_list = 2;
}

将导致一个json:

[
    {
        "this_is_a_message": "abc",
        "this_is_a_list": [
            "123",
            "qwe"
        ]
    },
    {
        "this_is_a_message": "aaaa",
        "this_is_a_list": [
            "foo",
            "bar"
        ]
    }
]

尽管生成了具有正确数量的 PROTOBUFFMESSAGE 的列表,但它们包含的所有字段都为空,所以我不确定这是否是映射问题、反射系统未检测到 protobuffs 字段或其他问题。如果有人知道如何做到这一点,那就太好了。顺便说一句,我在这里谈论的是 java。

编辑:

将json中的名称更改为:

        {
            "thisIsAMessage_": "abc",
            "thisIsAList_": [
                "123",
                "qwe"
            ]
        }

使反序列化发生。除了抛出的列表之外,它确实有效:

java.lang.IllegalArgumentException: Can not set com.google.protobuf.LazyStringList field Helper$...etc big path here...$PROTOBUFFMESSAGE$Builder.thisIsAList_ to java.util.ArrayList
4

2 回答 2

0

听起来您必须使用它GsonBuilder来构建一个Gson对象,并为对象编写和注册一个类型适配器com.google.protobuf.LazyStringList

于 2013-09-11T05:49:16.370 回答
0

Gson而不是通过构造函数初始化对象,而是使用这个片段:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(LazyStringList.class, new TypeAdapter<LazyStringList>() {

  @Override
  public void write(JsonWriter jsonWriter, LazyStringList strings) throws IOException {

  }

  @Override
  public LazyStringList read(JsonReader in) throws IOException {
    LazyStringList lazyStringList = new LazyStringArrayList();

    in.beginArray();

    while (in.hasNext()) {
      lazyStringList.add(in.nextString());
    }

    in.endArray();

    return lazyStringList;
  }
});
于 2016-06-08T16:11:36.350 回答