web-dev-qa-db-ja.com

Jersey / JAXB / Jacksonを使用したJava.util.MapからJSONオブジェクトへのマッピング

私はジャージを作成しようとしていましたREST Webサービス。次のようなJavaクラスからJSONオブジェクトを受信および出力したいのですが。

@XmlRootElement
public class Book {

    public String code;

    public HashMap<String, String> names;

}

これは次のようにJSONに変換する必要があります。

{
    "code": "ABC123",
    "names": {
        "de": "Die fabelhafte Welt der Amelie",
        "fr": "Le fabuleux destin d'Amelie Poulain"
    }
}

しかし、私はこれに対する標準的な解決策を見つけることができません。誰もが自分の wrappersolution を実装しているようです。この要件は私にとって極めて基本的なようです。これが一般的に受け入れられている解決策であるとは信じられません。特に、ジャージーは本当にJavaのより楽しい部分の1つであるためです。

私はこれだけを与えるジャクソン1.8にアップグレードしようとしましたが、これは非常に難読化されたJSONです。

{
    "code": "ABC123",
    "names": {
        "entry": [{
            "key": "de",
            "value": "Die fabelhafte Welt der Amelie"
        },
        {
            "key": "fr",
            "value": "Le fabuleux destin d'Amelie Poulain"
        }]
    }
}

これに対する提案された解決策はありますか?

26
samy-delux

なぜこれがデフォルト設定ではないのかわかりません。それを理解するのにしばらく時間がかかりましたが、JerseyでJSON変換を機能させたい場合は、

    <init-param>
        <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

あなたのweb.xmlにあなたのすべての問題を解決する必要があります。

PS:@XmlRootElementアノテーションを削除して機能させる必要もあります

24
Jan

google-gson を使用できます。これがサンプルコードです:

    @Test
    public void testGson(){
       Book book = new Book();
       book.code = "1234";
       book.names = new HashMap<String,String>();
       book.names.put("Manish", "Pandit");
       book.names.put("Some","Name");
       String json = new Gson().toJson(book);
       System.out.println(json);
   }

出力は{"code":"1234","names":{"Some":"Name","Manish":"Pandit"}}

7
lobster1234

私はそれがずっと前に尋ねられたことを知っていますが、物事は平均時間に変わったので、もはやパッケージcom.Sun.jersey、プロジェクトに追加されたこれらの2つの依存関係pom.xmlは同じ問題を解決しました:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.22</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.5.4</version> <!-- jackson version used by jersey v2.22 -->
</dependency>

web.xmlに何も追加する必要はありません。最初の依存関係はジャージーにPOJOからJSONへの変換にjacksonを使用するように指示します。 2番目の依存関係は、JacksonをジャージJSONプロバイダーとして登録します。

また、POJOのnull問題については、この注釈をPOJOクラスに追加します。

@JsonInclude(JsonInclude.Include.NON_NULL)
4
Lotzy