2

入力 JSON 文字列があり、JAXB アノテーション付きオブジェクトにアンマーシャリングする必要があります。私はこれを行うためにjettisonを使用しています。JSON 文字列は次のようになります。

{ 
  objectA : 
  { 
    "propertyOne" : "some val", 
    "propertyTwo" : "some other val",
    objectB : 
    {
      "propertyA" : "some val",
      "propertyB" : "true" 
    }
  }
}

ObjectA コードは次のようになります。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectA")
public class ObjectA {
    @XmlElement(required = true)
    protected String propertyOne;
    @XmlElement(required = true)
    protected String propertyTwo;
    @XmlElement(required = true)
    protected ObjectB objectB;
}

ObjectB クラスのコードは次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectB")
public class ObjectB {
    @XmlElement(required = true)
    protected String propertyA;
    @XmlElement(required = true)
    protected boolean propertyB;
}

アンマーシャリングに使用されるコード:

JAXBContext jc = JAXBContext.newInstance(OnjectA.class);
JSONObject obj = new JSONObject(theJsonString);
Configuration config = new Configuration();

MappedNamespaceConvention con = new MappedNamespaceConvention(config);
XMLStreamReader xmlStreamReader = new MappedXMLStreamReader(obj,con);
Unmarshaller unmarshaller = jc.createUnmarshaller();

ObjectA obj = (ObjectA) unmarshaller.unmarshal(xmlStreamReader);

例外や警告はスローされません。ObjectB はインスタンス化されていますが、そのプロパティの値が設定されていません。つまり、propertyA は null であり、propertyB はデフォルト値の false を取得しています。なぜこれが機能しないのかを理解するのに苦労しています。誰か助けてくれませんか?

4

1 に答える 1

8

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

モデルの JAXB マッピングは正しいようです。以下は、EclipseLink MOXyを介して利用可能なJSONバインディングを使用して、質問で指定された正確なモデルを使用したサンプルコードです。

デモ

package forum16365788;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {ObjectA.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File json = new File("src/forum16365788/input.json");
        ObjectA objectA = (ObjectA) unmarshaller.unmarshal(json);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(objectA, System.out);
    }

}

input.json/出力

以下は私が使用したJSONです。キーobjectAobjectBを引用する必要があります。質問にはこれがありません。

{
   "objectA" : {
      "propertyOne" : "some val",
      "propertyTwo" : "some other val",
      "objectB" : {
         "propertyA" : "some val",
         "propertyB" : true
      }
   }
}

詳細については

于 2013-05-05T11:43:40.270 に答える