2

私はGsonライブラリを使用していますが、JsonArrayオブジェクトをシリアライズすると、JSON配列ではなくオブジェクトとしてシリアライズされるようです。すなわち

{ 要素: [ {name:"value1}, {name:"value2"}]}

シリアル化された要素を削除するにはどうすればよいですか?

4

1 に答える 1

1

歩くと足が痛くなったので、医者に診てもらいました。医者は「その上を歩かないでください」と言った。

一般に、Gson のような API をJsonArray使用する場合、それが存在することさえ知らずに、代わりに API のデータ バインディング部分を使用するだけです。したがって、手動で を構築してJsonArrayからシリアル化する代わりに、JavaListまたは配列を にフィードするだけGson.toJson()です。例えば:

List list = new ArrayList();
list.add("one");
list.add(2);
list.add(new Foo());

Gson gson = new Gson();
String json = gson.toJson(list);
System.out.println(json);

そのアプローチがニーズに合わず、JsonArray何らかの理由で の使用に行き詰まっている場合はtoString()、そのメソッドを呼び出したくなるかもしれません。現在、最終的に必要なものが作成されているためです。toString()囲まれた配列の内容の有効な JSON 表現を作成することが保証されていると言うドキュメントには何もありません。Stringそのため、Gson の将来のリリースでは、同じ形式の を返さない可能性があります。

いずれにせよ、本当に JsonArray を使用したい場合は、次のように十分にシリアル化する必要があります。

JsonElement one = new JsonPrimitive("one");
JsonElement two = new JsonPrimitive(2);
JsonObject foo = new JsonObject();
foo.addProperty("foo", new Foo().foo);

JsonArray jsonArray = new JsonArray();
jsonArray.add(one);
jsonArray.add(two);
jsonArray.add(foo);

System.out.println(new Gson().toJson(jsonArray));
// ["one",2,{"foo":"hi"}]

注: この回答は Gson 2.2 API に基づいています。以前のバージョンの Gson にオーバーロードされたtoJson(JsonElement)メソッドが含まれていたかどうかは覚えていません。

toJsonメソッドが既にこの方法で使用されている (をシリアル化する)JsonArrayが、出力が元の質問で示されているとおりである場合、Java はオーバーロードされたメソッドの中から選択するときにランタイム タイプを考慮しないことを思い出してください。コンパイル時の型にバインドします。JsonElement(ラメ - 私は知っています。)したがって、どのメソッドにバインドするかをコンパイラに知らせるために、引数の型を にキャストする必要があるかもしれません。以下は、元の質問で実際に何が起こっているかを示しています。

System.out.println(new Gson().toJson((Object)jsonArray));
// {"elements":["one",2,{"foo":"hi"}]}
于 2013-04-03T05:42:26.290 に答える