2012-10-27 4 views
6
<a> 
    <b1>b1</b1> 
    <b2>b2</b2> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
</a> 

すべて<b3>がラッパー要素に含まれていないので、私は私のPOJOのJava BeanクラスにXMLファイルを読み込むためにジャクソンXmlMapper使用する場合、私はJAXBたUnmarshaller:ラッパーのない繰り返しXMLELEMENT

例外が発生しました <b3s>を言います
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.xxxxx] from String value; no single-String constructor/factory method (through reference chain: com.xxxx["xxx"]->com.xxx["xxx"]) 

私はどのようなアノテーションを使用しますか?

@XmlElement 
public List<B3> b3; 

答えて

0

ジャクソンは文字列をB3のインスタンスに変換する方法を知らない。コンストラクタ(またはB3を返すファクトリメソッド)をB3に追加します。Stringとなります。コンストラクタの例:

class B3 { 
    // ... 
    public B3(String value) { 
     // do something with value 
    } 
    // ... 
} 

http://wiki.fasterxml.com/JacksonFeatureCreators

4

あなたは "開封" の表現を使用する場合は、ジャクソン2.1を使用する必要があり、開封されたオプションを示しています

代わり
@JacksonXmlElementWrapper(useWrapping=false) 

、JAXB注釈を使用している場合デフォルトでは、ラッピングを使用しないでください。

最後に、あなたもして、ラッパー要素を使用しないようにデフォルトを変更することができます。

JacksonXmlModule module = new JacksonXmlModule(); 
// to default to using "unwrapped" Lists: 
module.setDefaultUseWrapper(false); 
XmlMapper xmlMapper = new XmlMapper(module); 
5

NOTE

ジャクソンはJAXB (JSR-222)準拠した実装ではありません。これは、JAXB (JSR-222)準拠した実装は、コレクションのプロパティにラッパー要素を適用しません。デフォルトでは


を標準JAXB注釈をどのように解釈するかの保証が存在しないことを意味します。デフォルトで

JAXB(JSR-222)の実装は、プロパティに基づいてマッピングをデフォルト設定されます。スペースを節約するために、これらのメソッドを省略し、@XmlAccessorType(XmlAccessType.FIELD)を指定して、メタデータがインスタンス変数(フィールド)から派生するようにしました。

package forum13097559; 

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

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

    private String b1; 
    private String b2; 
    private List<B3> b3; 

} 

B3

package forum13097559; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class B3 { 

    private String c1; 
    private String c2; 

} 

デモ

package forum13097559; 

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13097559/input.xml"); 
     A a = (A) unmarshaller.unmarshal(xml); 

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

} 

入力。詳細情報のためのXML /出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<a> 
    <b1>b1</b1> 
    <b2>b2</b2> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
</a> 

関連する問題