7

JAX-RSを使用してJavaでRESTfulWebサービスを作成しています。生成されたJSONで多くのオーバーヘッドが発生しています。

データクラス:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {

    private Map<String,String> data;

    Test() {}

    public Test(Map<String,String> data) {
        this.data = data;
    }

    public Map<String, String> getData() {
        return data;
    }
}

サービス:

@GET
@Path("/test")
@Produces("application/json; charset=UTF-8;")
public Test test() {
   Map<String,String> map = new HashMap<String,String>();
   map.put("foo", "bar");
   map.put("bingo", "bongo");
   return new Test(map);
}

生産:

{"data":{"entry":[{"key":"foo","value":"bar"},{"key":"bingo","value":"bongo"}]}}

私はそれを生産したいと思います:

{"data":{"foo":"bar","bingo":"bongo"}}

これを達成するための最も簡単な方法は何ですか?データクラスを自由に再定義できますが、マップのキーやサイズを事前に知ることはできません。

4

3 に答える 3

5

最も簡単な方法は、List<Pair>代わりに where Pairis を 2 つのプロパティを持つ単なる Javabean として使用することです。

于 2009-12-14T11:48:18.307 に答える
1

JAXB アノテーション付きオブジェクトを使用せず、単純な POJO を使用する場合は、Jackson JSON ライブラリーと共に POJO マッピング機能を有効にするだけで、正しい動作を得ることができます。

web.xml、フィルタ (サーブレットと同様) を使用している場合、構成は次のようになります。

<filter>
  <filter-name>Jersey</filter-name>
  <filter-class>...</filter-class>
  <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

そして、maven 構成の jersey-json 依存関係に依存するか、Web サイトからダウンロードして、jackson をクラスパスに入れます。この回答この回答、およびこのブログ投稿も参照してください。そして、なぜこれが標準的な動作ではないのか、私にはわかりません。

于 2012-11-30T13:50:47.877 に答える