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 を含むリストが生成されますが、それらにはすべてのフィールドが null に含まれているため、これがマッピングの問題なのか、リフレクション システムがプロトバフ フィールドを検出しないのか、それ以外の問題なのかはわかりません。誰かがこれを行う方法を知っていれば、それは素晴らしいことです。ところで、私はここで 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 に答える