2017-05-04 5 views
1

デシリアライズ内側部分は、以下の(簡略化)フォーマットでXMLを考える

<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer> 

私はそれを表すクラスに<inner>要素をデシリアライズし、残りを廃棄したいです。

public class Inner { 
    private String field1; 
    private String field2; 
    private String field3; 
    // getters, setters, ctor 
} 

私は、デシリアライズを実行するためにJackson XmlMapperクラスを使用しています。私がxml文字列の中で<outer>を取り除いても、それは明らかに機能します。

XmlMapper xmlMapper = new XmlMapper(); 
// in my scenario the `<inner>` element actually contains fields I don't care about 
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Inner inner = xmlMapper.readValue(xml, Inner.class); 
System.out.println(inner); 
// Inner(field1=a, field2=b, field3=c) 

私は<outer>要素を残す場合inner内のすべてのフィールドがnullです。

Innerクラスに@JacksonXmlRootElement(localName = "inner")と注釈を付けることを試みましたが、出力が変更されませんでした。

<outer>要素を表すクラスを作成できましたが、それは無駄に思えます。私はおそらく<inner>要素の間にxmlだけを含む新しい文字列を作成することもできますが、もう少しハッキリに感じます。

私の場合、xmlは別のシステムによってブロードキャストされています。私はコントロールがないので、xml構造を単純に修正できます。

"inner" xmlを新しいクラスインスタンスにデシリアライズすることはできますか?

答えて

1

@JacksonXmlRootElement(localName = "inner")が期待通りに機能するように思われる場合は、UNWRAP_ROOT_VALUEも必要です。例えば。

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

私は、上記のことはドキュメントからはっきりとは言えません。

+0

ありがとうございました。それが特徴だったようです。 –

関連する問題