27

Jersey/Java で REST サーバーを作成していますが、奇妙な動作を発見しました。

オブジェクトの配列をJsonとして返すメソッドがサーバーにあります

@GET
@Path("/files")
@Produces(MediaType.APPLICATION_JSON)
public Object getFiles() throws Exception{
    DatabaseManager db = new DatabaseManager();
    FileInfo[] result = db.getFiles();
    return result;
}

コードが正しく実行され、データがクライアントに返されます (jQuery ajax 呼び出し)。問題は、「結果」配列に 1 つまたは複数の要素がある場合、返されるデータの形式が変わることです。

要素が 1 つの応答:

{"fileInfo":{"fileName":"weather.arff","id":"10"}}

2 つの要素を持つ応答:

{"fileInfo":[{"fileName":"weather.arff","id":"10"},{"fileName":"supermarket.arff","id":"11"}]}

ご覧のとおり、最初のシナリオでは返されるオブジェクトの「fileInfo」プロパティの値はオブジェクトであり、2 番目のシナリオでは値は配列です。私は何を間違っていますか?最初のケースは次のようなものを返すべきではありません:

{"fileInfo":[{"fileName":"weather.arff","id":"10"}]}

つまり、内部に単一のオブジェクトを持つ配列ですか?

クライアント側でこれを検出できることはわかっていますが、非常に醜いハックのようです。

御時間ありがとうございます。

4

8 に答える 8

12

ジャージーの公式ドキュメント (http://jersey.java.net/nonav/documentation/latest/user-guide.html#json.pojo.approach.section) にも記載されている Jackson を使用することになりました。

以前に試したことがありますが、プロジェクトのビルドパスにjackson jarがなかったため、機能しませんでした(ドキュメントに基づいて、ジャージーのコアライブラリに組み込まれていると思いました)。

jackson-all.jar ファイル (http://wiki.fasterxml.com/JacksonDownload) を追加し、構成で POJO サポートを有効にしました。

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

そして出来上がり!

于 2012-11-27T23:05:58.040 に答える
5

JAXB を使用して JSON 結果を作成していた場合は、Jersey JSON プロセッサを構成して、より重要な JSON 形式を取得できます。

ジャージの公式ドキュメントには詳細な設定があります:

より重要な JSON 形式の変更を実現するには、Jersey JSON プロセッサ自体を構成する必要があります。JSONConfiguration インスタンスでは、さまざまな構成オプションを設定できます。このインスタンスをさらに使用して、この領域の主要な構成ポイントとして機能する JSONConfigurated JSONJAXBContext を作成できます。特殊化された JSONJAXBContext を Jersey に渡すには、最終的に JAXBContext ContextResolver を実装する必要があります。

    @Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final JAXBContext context;
    private final Set<Class> types;
    private Class[] ctypes = { FileInfo.class}; //your pojo class
    public JAXBContextResolver() throws Exception {
        this.types = new HashSet(Arrays.asList(ctypes));
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(),
                ctypes); //json configuration
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}
于 2012-11-27T04:42:37.473 に答える
1

私は cxf を使用しています。JSON で配列を強制するための applicationContext.xml は次のとおりです。

<jaxrs:server id="myService" serviceName="MyService"
address="/mysvc">
<jaxrs:serviceBeans>
    <ref bean="myServiceImpl"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
    <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
   <property name="dropRootElement" value="true" />
   <property name="supportUnwrapped" value="true" />
   <property name="namespaceMap">
      <map>
        <entry key="http://example.com/myservice" value=""/>
      </map>
   </property>
   <property name="arrayKeys">
      <list>
    <value>fileInfo</value>
      </list>
   </property>                          
    </bean>
</jaxrs:providers>
</jaxrs:server>
于 2015-06-17T14:10:40.497 に答える
0

Genson ライブラリhttp://code.google.com/p/genson/を試すこともできます。jersey とうまく統合されます。クラスパスに jar をドロップするだけで、すべてが機能します。追加のコードを記述する必要はありません。現在のように動作するはずですが、奇妙な結果はありません。

于 2012-11-27T09:01:01.047 に答える
0

私はかなり苦労して、この簡単な解決策を見つけました

pom.xml で:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-xc</artifactId>
    <version>1.9.13</version>
</dependency>

web.xml で:

<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.other-packages;org.codehaus.jackson.jaxrs</param-value>
</init-param>
于 2016-06-11T06:15:47.503 に答える
0

Jettison (Jersey に付属) を使用JSONObjectしてJSONArray、戻り値として使用したい構造を準備できます。それらは、の推移的な依存関係であるパッケージorg.codehaus.jettison.jsonに含まれていますjettison-1.3.2.jarjerysey-json

于 2012-11-27T00:24:22.503 に答える