使用Jackson将XML属性添加到手动构建的节点树

我正在尝试设置代码来创建节点树Jackson,然后可以使用该树来编写JSONXML。我已经手动创建了节点树,如下所示:

XmlMapper nodeMapper = new XmlMapper();

ObjectNode rootNode = nodeMapper.createObjectNode();

ObjectNode currentNode = rootNode.putObject("Examples");

currentNode.put("Puppy", TRUE)

.put("Apple", 2)

.put("Jet", "Li");

currentNode = rootNode.putObject("Single");

currentNode.put("One", 1);

String writePath = "C:/users/itsameamario/Documents/basicXMLtest.xml";

nodeMapper.writeValue(new File(writePath), rootNode);

我的XML输出是:

<?xml version="1.0"?>

<ObjectNode>

<Examples>

<Puppy>true</Puppy>

<Apple>2</Apple>

<Jet>Li</Jet>

</Examples>

<Single>

<One>1</One>

</Single>

</ObjectNode>

但是,对于XML的某些部分,我想向其中一个节点添加属性,如下所示:

<Examples overlyComplicated="yes">

<!--...-->

</Examples>

我发现的所有包含属性的示例都应用于一个预先存在的类。我一直找不到如上所述的将属性添加到手动构建的节点树的方法。是否可以使用Jackson

回答:

attribute由于ObjectNode对序列化一无所知,因此无法标记给定的属性。您可以对POJO类执行此操作,并且com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator仅在@JacksonXmlProperty(isAttribute

= true)给定属性使用批注时才进行处理。我建议为POJO需要属性的元素创建元素,并使用Jackson

XML批注或实现JsonSerializable接口。它可能如下所示:

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.databind.JsonSerializable;

import com.fasterxml.jackson.databind.SerializationFeature;

import com.fasterxml.jackson.databind.SerializerProvider;

import com.fasterxml.jackson.databind.jsontype.TypeSerializer;

import com.fasterxml.jackson.databind.node.ObjectNode;

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;

import java.io.IOException;

import java.util.LinkedHashMap;

import java.util.Map;

public class XmlMapperApp {

public static void main(String[] args) throws Exception {

Map<String, Object> map = new LinkedHashMap<>();

map.put("Puppy", Boolean.TRUE);

map.put("Apple", 2);

map.put("Jet", "Li");

Examples examples = new Examples();

examples.setOverlyComplicated("yes");

examples.setMap(map);

XmlMapper mapper = new XmlMapper();

mapper.enable(SerializationFeature.INDENT_OUTPUT);

ObjectNode rootNode = mapper.createObjectNode();

rootNode.putPOJO("Examples", examples);

ObjectNode currentNode = rootNode.putObject("Single");

currentNode.put("One", 1);

mapper.writeValue(System.out, rootNode);

}

}

class Examples implements JsonSerializable {

@Override

public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {

ToXmlGenerator toXmlGenerator = (ToXmlGenerator) gen;

toXmlGenerator.writeStartObject();

writeAttributes(toXmlGenerator);

writeMap(toXmlGenerator);

toXmlGenerator.writeEndObject();

}

private void writeAttributes(ToXmlGenerator gen) throws IOException {

if (overlyComplicated != null) {

gen.setNextIsAttribute(true);

gen.writeFieldName("overlyComplicated");

gen.writeString(overlyComplicated);

gen.setNextIsAttribute(false);

}

}

private void writeMap(ToXmlGenerator toXmlGenerator) throws IOException {

for (Map.Entry<String, Object> entry : map.entrySet()) {

toXmlGenerator.writeObjectField(entry.getKey(), entry.getValue());

}

}

@Override

public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {

serialize(gen, serializers);

}

private String overlyComplicated;

private Map<String, Object> map;

// getters, setters, toString

}

上面的代码打印:

<ObjectNode>

<Examples overlyComplicated="yes">

<Puppy>true</Puppy>

<Apple>2</Apple>

<Jet>Li</Jet>

</Examples>

<Single>

<One>1</One>

</Single>

</ObjectNode>

如果要使用相同的对象Example

POJO进行JSON序列化,则需要在serialize方法中处理它或创建另一个对象ObjectNode而不是Examlples对象。

以上是 使用Jackson将XML属性添加到手动构建的节点树 的全部内容, 来源链接: utcz.com/qa/429253.html

回到顶部