2011-01-07 12 views
22

Gsonを使用してオブジェクトをシリアル化する際に問題が発生しました。Gsonはルート値を含むPOJOをシリアル化しますか?

@XmlRootElement 
class Foo implements Serializable { 
    private int number; 
    private String str; 

    public Foo() { 
     number = 10; 
     str = "hello"; 
    } 
} 

Gsonは、JSON

{"number":10,"str":"hello"}にこれをシリアライズします。

はしかし、私はそれはとても基本的にトップレベルの要素を含む

{"Foo":{"number":10,"str":"hello"}}

になりたいです。私はGsonでこれを行う方法をGoogleに試みましたが、運はありません。誰かがこれを達成する方法があるかどうかを知っていますか?

ありがとうございます!

答えて

19

オブジェクトツリーの上部に要素を追加する必要があります。

Gson gson = new Gson(); 
JsonElement je = gson.toJsonTree(new Foo()); 
JsonObject jo = new JsonObject(); 
jo.add("Foo", je); 
System.out.println(jo.toString()); 
// Prints {"Foo":{"number":10,"str":"hello"}} 
+2

:あなたの所望の構造を与えるであろう

new GsonBuilder().create().toJson(responseWrapperObj); 

を:

public class ResponseWrapper { @SerializedName("Foo") private Foo foo; public Foo getFoo() { return foo; } public void setFoo(Foo foo) { this.foo= foo; } } 

その後、あなたは簡単に使用してJSONを解析することができますクラス型 "Foo"を要素にハードコードします。 – fei

+0

@feiはい。理想的には、あなたがGsonから得ているものは正しいです。 JSONの 'Foo'オブジェクトの正しい表現は' {"number":10、 "str": "hello"} 'です。その場合、インスタンス変数としてFooを持つクラスがある場合は、 '{" foo ":{" number ":10、" str ":" hello "}}' - を前に置く必要があります明示的にクラス名を追加する必要があります。 – Nishant

15

の代わりにあなたが行うことができますタイプをハードコーディング:このような何か

... 
jo.add(Foo.getClass().getSimpleName(), je); 
+2

私はこれが他の答えのコメントであり、それ自身の答えではないと思う。しかし実際には良いコメントです – mbritto

-1

あなたはジャクソンのAPIを使用している場合は、以下の行に真

mapper.configure(SerializationFeature.WRAP_ROOT_VALUEを使用); mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE、true);

+0

質問の状態のopのタイトルはGSONであり、ジャックソンではありません – dstarh

6

これを実行するより良い方法は、ラッパークラスを作成し、その内部にFooのオブジェクトを作成することです。

サンプルコード:まあ、これは私が必要があることを意味

{"Foo":{"number":10,"str":"hello"}} 
+0

これははるかに良い応答です。 –

+0

実際には別のオブジェクトを作成しています... 3つのモデルを持つ小さなアプリケーションではこれは問題ありませんが、40+を維持してこれらのラッパーを作成しています... –

関連する問題