1

私は jax-rs を使用し、JAXRSOutInterceptor によって Jetty でマーシャリングされるエンティティを追加していますが、JSON 出力は次のような追加の空のプロパティで変更されています: "$": ""

JSONProvider は次のように作成および構成されます。

JSONProvider jsonProvider = new JSONProvider();
jsonProvider.setConvertTypesToStrings(true);
jsonProvider.setIgnoreNamespaces(true);
jsonProvider.setIgnoreMixedContent(true);
jsonProvider.setUnmarshallAsJaxbElement(true);
providers.add(jsonProvider);

また、名前空間を使用する XML にマーシャリングされていますが、JSON の出力と入力には使用したくありません。

マーシャリングされているオブジェクトは次のようになります。

@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {

    MyObject2 a;
    MyObject2 b;
    MyObject2 c;

// includes getters, setters, hashCode, equals, toString,   
}

MyObject2 が次の場合:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {

    String x;
    String y;
    List<String> z;

// includes getters, setters, hashCode, equals, toString,   
}

残りの出力は次のとおりです。

{
   "myObject1": {
      "a": {
         "x": "value1",
         "y": "value2",
         "z": "value3",
         "$": ""
      },
      "$": ""
   }
}

末尾の「$」を取り除くにはどうすればよいですか: "" Jettison (これは私が使用しているデフォルトの JSONProvider 実装です) は、デフォルトで @XmlValue でマップされたプロパティを「$」として表しますが、プロパティはありません。 ?

それは Serializable を実装することによって引き起こされますか?

4

1 に答える 1

1

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

Jettison は実際には JSON プロバイダーではありませんが、XML ライブラリが JSON を生成/消費できるようにする API です。それはまともな仕事をしますが、あなたが今経験しているような問題が発生する可能性があります. また、サイズが 1 のリストが JSON 配列としてマーシャリングされないという問題も見られます。

現在の設定でこれを機能させる方法が見つからない場合。以下は、JSON プロバイダーとして MOXy を使用してできることです。

MyObject1

package forum11262807;

import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {

    MyObject2 a;
    MyObject2 b;
    MyObject2 c;

}

MyObject2

package forum11262807;

import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {

    String x;
    String y;
    List<String> z;

}

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

以下は、JSON の読み取り/書き込みを示すスタンドアロン コードです。

package forum11262807;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(MyObject1.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", "application/json");
        File json = new File("src/forum11262807/input.json");
        MyObject1 myObject1 = (MyObject1) unmarshaller.unmarshal(json);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(myObject1, System.out);
    }

}

input.json/出力

結果の JSON メッセージには"$"プロパティが含まれず、サイズ 1 のリストは JSON 配列として表されるプロパティです。

{
   "myObject1" : {
      "a" : {
         "x" : "value1",
         "y" : "value2",
         "z" : [ "value3" ]
      }
   }
}

JAX-RS 統合

MOXy には、JAX-RS アプリケーションでの構成を容易にする MOXyJsonProvider クラスが含まれています。

于 2012-06-29T18:15:04.460 に答える