7

last.fm API からの応答を解析しています。しかし、彼らはいくつかの応答にラッパーを使用しているようで、これが少し苦痛を引き起こしています。例を挙げると:

 {
   "artists":{
      "artist":[
         {
            "name":"Coldplay",
            "playcount":"816763",
            "listeners":"120815",
            "mbid":"cc197bad-dc9c-440d-a5b5-d52ba2e14234",
            "url":"http:\/\/www.last.fm\/music\/Coldplay",
            "streamable":"1"
         },
         {
            "name":"Radiohead",
            "playcount":"846668",
            "listeners":"99135",
            "mbid":"a74b1b7f-71a5-4011-9441-d0b5e4122711",
            "url":"http:\/\/www.last.fm\/music\/Radiohead",
            "streamable":"1"
         }
      ],
      "@attr":{
         "page":"1",
         "perPage":"2",
         "totalPages":"500",
         "total":"1000"
      }
   }
}

応答がアーティスト オブジェクトにラップされるだけでなく、オブジェクトの配列にもオブジェクト ラッパーがあります。

したがって、次のようなラッパークラス:

public class LastFMArtistWrapper {
    public List<Artist> artists;

}

うまくいきません。私はこれを回避し、2 つのラッパー クラスを作成しましたが、これは非常に見苦しく見えます。Jackson で @XMLElementWrapper のようなものを使用する方法はありますか?

4

1 に答える 1

5

プロバイダーから返されるJSON応答は、さまざまなオブジェクトの階層のシリアル化された表現ですが、説明からすると、実際には、この表現の特定のサブセットであるアーティストのコレクションを使用して操作するだけでよいように思えます。

この表現をミラーリングする1つのソリューションには、Javaクラスの同じ階層を作成することが含まれます。これにより、不要なクラスの形で余分なオーバーヘッドが発生します。私が理解していることから、これはあなたが避けたいものです。

org.jsonプロジェクトは、より大きなJSON表現で単一の汎用キー/値ペアを表す汎用JSONObjectクラスを作成しました。JSONObjectには、他のJSONObjectとJSONArrayを含めることができ、追加のクラスを維持および作成するという余分なオーバーヘッドなしに、表現をミラーリングします。

したがって、これら2つのオブジェクトは、構造を複製することなく、JSON表現の階層の複数のレイヤー全体で再利用できます。続行する方法の例を次に示します。

// jsonText is the string representation of your JSON
JSONObject jsonObjectWrapper = new JSONObject(jsonText);  

// get the "artists" object
JSONObject jsonArtists = jsonObjectWrapper.get("artists");

// get the array and pass it to Jackson's ObjectMapper, using TypeReference
  // to deserialize the JSON ArrayList to a Java ArrayList.
List<Artist> artists = objectMapper.readValue(
        jsonObjectWrapper.getString("artist"),
            new TypeReference<ArrayList<Artist>>() { });

上記の方法を使用すると、不要な混乱を追加するだけのPOJOオブジェクトの余分なレイヤーを作成する必要があるという余分なオーバーヘッドを削減できます。

TestCollectionDeserializationには、コレクションを操作するときのreadValueメソッドの例がいくつか含まれており、役立つ場合があります。

于 2012-05-26T05:56:58.697 に答える