7
<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>がラッパー要素に含まれていないため、 <b3s>Jackson を使用XmlMapperして XML ファイルを POJO Java Bean クラスに読み込むと、例外が発生しました。

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;
4

3 に答える 3

6

「ラップされていない」表現を使用する場合は、Jackson 2.1 を使用し、ラップされていないオプションを指定する必要があります。

@JacksonXmlElementWrapper(useWrapping=false)

あるいは、JAXB アノテーションを使用する場合、デフォルトではラッピングを使用しないようにする必要があります。

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

JacksonXmlModule module = new JacksonXmlModule();
// to default to using "unwrapped" Lists:
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
于 2012-10-28T06:45:06.430 に答える
5

ノート

Jackson はJAXB (JSR-222)準拠の実装ではありません。これは、標準の JAXB アノテーションを解釈する方法について保証がないことを意味します。


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

デフォルトでは、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);
    }

}

input.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>

詳細については

于 2012-10-29T14:37:25.147 に答える
0

Jackson does not know how to turn a string into an instance of B3. Add a constructor (or factory method which returns a B3) to B3 which takes a single String. Constructor example:

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

http://wiki.fasterxml.com/JacksonFeatureCreators

于 2012-10-27T05:52:02.447 に答える