5

私のコントローラ(@ResponseBodyを使用して)このmyobjオブジェクトのリストを返すとジャクソン - JSONは次のようになりますルートオブジェクト

public MyObj 
{ 
    int a; 
    int b; 
} 

オブジェクトのリストをラッピングリターン:私は希望

[{"a":1,"b":2},{"a":2,"b":2}] 

私はSerializationConを有効にする必要が読んだものから

{ "data": [{"a":1,"b":2},{"a":2,"b":2}]} 

:それはのようなものを返しますので、このJSONをラップしますfig.Feature.WRAP_ROOT_VALUEまたは(?)コントローラの上に @JsonRootName( "data")を使用します。

@ XmlRootElementも試してみましたが、何も動作していないようです。 オブジェクトのリストをルート名で囲む正しい方法は何ですか?

+1

あなたはこれを行う方法を理解しましたか?私はリストの地図を作成してObjectMapperにそれをさせることで道について考えましたが、それほどエレガントではありません。私はこれを行うより良い方法があると思います。あなたはそれを把握しましたか? – Seagull

答えて

6

@JsonRootNameをオブジェクトではなくリストに載せているように聞こえているようですが、それはあなたがしようとしていることを達成できません。

、あなたが上記のようなSerializationFeature.WRAP_ROOT_VALUEを有効にして、クラスに注釈を追加したいと思う@JsonRootName使用したい場合:

@JsonRootName("data") 
public MyObj { 
    int a; 
    int b; 
} 

これはオブジェクト自体をラップする、ないリスト:

{ 
    "listName": [ 
     { 
      "data": {"a":1, "b":2} 
     }, 
     { 
      "data": {"a":2, "b":2} 
     } 
    ] 
} 

オブジェクトにリストをラップする場合は、一般的なオブジェクトラッパーを作成するのが最適なソリューションです。これは、このようなクラスで実現することができます。

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

    public static <E> Map<String, E> withLabel(String label, E wrappedObject) { 
     return Collections.singletonMap(label, wrappedObject); 
    } 
} 

次に、あなただけのJsonObjectWrapper.withLabel("data", list)でそれをラップし、ジャクソンは残りの世話をする、応答で戻ってあなたのリストを送信する前に。

+0

おそらく、Collections.singletonMap(label、wrappedObject)が効率的で合意になるでしょうか? –

+0

すばらしい提案@charlie_pl!投稿を更新しました。 –

関連する問題