使用动态字段反序列化嵌套 XML
Deserialize nested XML with dynamic fields
我有以下 XML-数据,由 liferay-Portal 6.2 为期刊文章生成:
<root available-locales="de_DE" default-locale="de_DE">
<dynamic-element name="Begriff" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[Transition]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Abkürzung" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Synonyme" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Text" index="0" type="text_area" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[<p>...</p>
<p>Beispielsweise wird d...</p>]]></dynamic-content>
</dynamic-element>
</root>
如何使用 Jackson-Annotation
从 XML 中获取 POJO
我从以下内容开始:
@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown=true)
public class BlogEntryContent implements Serializable {
@JacksonXmlElementWrapper(localName = "dynamic-element")
private List<DynamicElement> dynamicElement= new ArrayList<>();
// Constructors
public BlogEntryContent() {
}
//Getters an Setters
...
和 class DynamicElement:
@JsonIgnoreProperties(ignoreUnknown=true)
public class DynamicElement implements Serializable {
@JacksonXmlElementWrapper(localName = "dynamic-content")
private List<DynamicContent> dynamicContent = new ArrayList<>();
//Constructors
public DynamicElement() {
}
public DynamicElement(List<DynamicContent> dynamicContent) {
this.dynamicContent = dynamicContent;
}
//Getters and Setters
...
但这并没有真正起作用:-(
您需要在 @XmlRootElement
注释中为 BlogEntryContent
class 提供根元素名称。这里无法识别 XML 数据的根元素。
尝试使用 like::
@XmlRootElement(name = "root")
。它会起作用。
@pratik 指导我正确的方法。
正确的代码如下所示:
@JsonIgnoreProperties(ignoreUnknown=true)
@JacksonXmlRootElement(localName = "root")
public class BlogContent {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "dynamic-element")
List dynElem;
//Constructor
...
//Getters
...
}
重要的是使用 @JacksonXmlRootElement(localName = "root") 设置根名称并设置 JacksonXmlElementWrapper(useWrapping = false),因为 xml 中没有包装器!
@XmlRootElement(name = "root") 也有效!
我有以下 XML-数据,由 liferay-Portal 6.2 为期刊文章生成:
<root available-locales="de_DE" default-locale="de_DE">
<dynamic-element name="Begriff" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[Transition]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Abkürzung" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Synonyme" index="0" type="text" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Text" index="0" type="text_area" index-type="keyword">
<dynamic-content language-id="de_DE"><![CDATA[<p>...</p>
<p>Beispielsweise wird d...</p>]]></dynamic-content>
</dynamic-element>
</root>
如何使用 Jackson-Annotation
从 XML 中获取 POJO我从以下内容开始:
@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown=true)
public class BlogEntryContent implements Serializable {
@JacksonXmlElementWrapper(localName = "dynamic-element")
private List<DynamicElement> dynamicElement= new ArrayList<>();
// Constructors
public BlogEntryContent() {
}
//Getters an Setters
...
和 class DynamicElement:
@JsonIgnoreProperties(ignoreUnknown=true)
public class DynamicElement implements Serializable {
@JacksonXmlElementWrapper(localName = "dynamic-content")
private List<DynamicContent> dynamicContent = new ArrayList<>();
//Constructors
public DynamicElement() {
}
public DynamicElement(List<DynamicContent> dynamicContent) {
this.dynamicContent = dynamicContent;
}
//Getters and Setters
...
但这并没有真正起作用:-(
您需要在 @XmlRootElement
注释中为 BlogEntryContent
class 提供根元素名称。这里无法识别 XML 数据的根元素。
尝试使用 like::
@XmlRootElement(name = "root")
。它会起作用。
@pratik 指导我正确的方法。 正确的代码如下所示:
@JsonIgnoreProperties(ignoreUnknown=true)
@JacksonXmlRootElement(localName = "root")
public class BlogContent {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "dynamic-element")
List dynElem;
//Constructor
...
//Getters
...
}
重要的是使用 @JacksonXmlRootElement(localName = "root") 设置根名称并设置 JacksonXmlElementWrapper(useWrapping = false),因为 xml 中没有包装器! @XmlRootElement(name = "root") 也有效!