4

私は、Jersey+Jackon を使用して、JSON で動作する REST API を作成しています。

次のようなクラスがあるとします。

@XmlRootElement
public class A {
    public String s;
}

そして、これがクラスを使用する私のジャージーメソッドです:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Object get(@PathParam("id") String id) throws Exception{
    A[] a= new A[2];
    a[0] = new A();
    a[0].s="abc";
    a[1] = new A();
    a[1].s="def";
    return a;
}

出力は次のとおりです。

{"a":[{"s":"abc"},{"s":"def"}]}

しかし、私はそれが次のようになりたい:

[{"s":"abc"},{"s":"def"}]

私は何をすべきか?私を助けてください。

4

3 に答える 3

2

あなたの要件は、json文字列からルート要素を削除することのようです。これは、Jerseyで次のように構成できます。ジャージーでは、ルート要素の削除がによって構成されているかどうかJSONConfiguration.rootUnwrapping()。詳細については、JerseyとCXFのJSONサポートをご覧ください。

これを行うサンプルコードを次に示します。

   @Provider
   public class MyJAXBContextResolver implements ContextResolver<JAXBContext> {

       private JAXBContext context;
       private Class[] types = {StatusInfoBean.class, JobInfoBean.class};

       public MyJAXBContextResolver() throws Exception {
           this.context = new JSONJAXBContext(
                   JSONConfiguration.mapped()
                                      .rootUnwrapping(true)
                                      .arrays("jobs")
                                      .nonStrings("pages", "tonerRemaining")
                                      .build(),
                   types);
       }

       public JAXBContext getContext(Class<?> objectType) {
           return (types[0].equals(objectType)) ? context : null;
       }
   }
于 2012-06-14T06:28:38.720 に答える
0

<servlet>関連するノードの下のweb.xmlに以下を追加してみてください。

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

ジャージーのドキュメントには、この設定に関する詳細情報があります。

この機能はJersey1.4で導入され、Jacksonに依存しています。Glassfish 3.0.1以下にバンドルされているバージョンを使用している場合は、アップグレード手順に従う必要があります。

于 2012-10-13T18:38:15.453 に答える
0

最初のものは有効なJSON文字列です。

2番目はそうではありません。

于 2012-06-14T06:28:12.387 に答える