Java 有没有一种方法可以使用自定义XMLAdapter实现@XmlPath(";)的功能?
我试图使用Java 有没有一种方法可以使用自定义XMLAdapter实现@XmlPath(";)的功能?,java,xml,jaxb,eclipselink,moxy,Java,Xml,Jaxb,Eclipselink,Moxy,我试图使用JAXB/Moxy对POJOjava类进行解组和封送处理。封送处理工作正常,但解封处理未按预期工作。经过大量的尝试和分析,我发现这是由于注释@XmlPath(“.”造成的 我希望保留@XmlPath(“.”)的功能,但不使用注释,而不是从XMLAdapter获取该功能。但我对如何实现这一目标感到困惑。我想知道这里是否有人能帮我 以下是我拥有的XML: <Customer xmlns:google="https://google.com/test">
JAXB/Moxy
对POJO
java类进行解组和封送处理。封送处理
工作正常,但解封处理
未按预期工作。经过大量的尝试和分析,我发现这是由于注释@XmlPath(“.”
造成的
我希望保留@XmlPath(“.”)的功能,但不使用注释,而不是从XMLAdapter
获取该功能。但我对如何实现这一目标感到困惑。我想知道这里是否有人能帮我
以下是我拥有的XML
:
<Customer xmlns:google="https://google.com/test">
<name>BATMAN</name>
<age>2008</age>
<google:main>
<google:sub>bye</google:sub>
</google:main>
</Customer>
我想删除@XmlPath(“.”
,并通过XmlAdapter
保留其功能。因此,当我使用JACKSON将此XML转换为JSON时,我得到以下输出:
{
"name" : "Rise Against",
"age" : "2000",
"google:main":{
"google:sub" : "bye"
}
}
当我封送XML时,我得到了上面提供的XML文件(注意,others
节点没有被添加,但是它的内容被添加到XML和JSON中)
以下是我目前拥有的XMLAdapter
:
class TestAdapter extends XmlAdapter<Wrapper, Map<String, Object>> {
@Override
public Map<String, Object> unmarshal(Wrapper value) throws Exception {
//Loop across all elements within ILMD tag
final Map<String, Object> extensions = new HashMap<>();
for (Object obj : value.getElements()) {
Element element = (Element) obj;
//System.out.println("Node Name : " + element.getNodeName() + " Value : " + element.getTextContent());
final NodeList children = element.getChildNodes();
if (children.getLength() == 1) {
extensions.put(element.getNodeName(), element.getTextContent());
} else {
List<Object> child = new ArrayList<>();
for (int i = 0; i < children.getLength(); i++) {
final Node n = children.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
Wrapper wrapper = new Wrapper();
List childElements = new ArrayList();
childElements.add(n);
wrapper.elements = childElements;
child.add(unmarshal(wrapper));
}
}
extensions.put(element.getNodeName(), child);
}
}
return extensions;
}
@SuppressWarnings("unchecked")
@Override
public Wrapper marshal(Map<String, Object> v) throws Exception {
Wrapper wrapper = new Wrapper();
List elements = new ArrayList();
for (Map.Entry<String, Object> property : v.entrySet()) {
if (property.getValue() instanceof Map) {
elements.add(new JAXBElement<Wrapper>(new QName(property.getKey()), Wrapper.class, marshal((Map) property.getValue())));
} else {
elements.add(new JAXBElement<String>(new QName(property.getKey()), String.class, property.getValue().toString()));
}
}
wrapper.elements = elements;
return wrapper;
}
}
class Wrapper {
@XmlAnyElement
List elements;
public List getElements() {
return elements;
}
}
有人能告诉我如何使用XMLAdapter
获得Moxy@XmlPath(“.”)的功能吗?任何帮助都将不胜感激
class TestAdapter extends XmlAdapter<Wrapper, Map<String, Object>> {
@Override
public Map<String, Object> unmarshal(Wrapper value) throws Exception {
//Loop across all elements within ILMD tag
final Map<String, Object> extensions = new HashMap<>();
for (Object obj : value.getElements()) {
Element element = (Element) obj;
//System.out.println("Node Name : " + element.getNodeName() + " Value : " + element.getTextContent());
final NodeList children = element.getChildNodes();
if (children.getLength() == 1) {
extensions.put(element.getNodeName(), element.getTextContent());
} else {
List<Object> child = new ArrayList<>();
for (int i = 0; i < children.getLength(); i++) {
final Node n = children.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
Wrapper wrapper = new Wrapper();
List childElements = new ArrayList();
childElements.add(n);
wrapper.elements = childElements;
child.add(unmarshal(wrapper));
}
}
extensions.put(element.getNodeName(), child);
}
}
return extensions;
}
@SuppressWarnings("unchecked")
@Override
public Wrapper marshal(Map<String, Object> v) throws Exception {
Wrapper wrapper = new Wrapper();
List elements = new ArrayList();
for (Map.Entry<String, Object> property : v.entrySet()) {
if (property.getValue() instanceof Map) {
elements.add(new JAXBElement<Wrapper>(new QName(property.getKey()), Wrapper.class, marshal((Map) property.getValue())));
} else {
elements.add(new JAXBElement<String>(new QName(property.getKey()), String.class, property.getValue().toString()));
}
}
wrapper.elements = elements;
return wrapper;
}
}
class Wrapper {
@XmlAnyElement
List elements;
public List getElements() {
return elements;
}
}
public class CustomExtensionsSerializer extends JsonSerializer<Map<String, Object>> {
private static final ObjectMapper mapper = new ObjectMapper();
@Override
public void serialize(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
recusiveSerializer(value, gen, serializers);
gen.writeEndObject();
}
public void recusiveSerializer(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
for (Map.Entry<String, Object> extension : value.entrySet()) {
if (extension.getValue() instanceof Map) {
//If instance is MAP then call the recursive method
recusiveSerializer((Map) extension.getValue(), gen, serializers);
} else if (extension.getValue() instanceof String) {
//If instance is String directly add it to the JSON
gen.writeStringField(extension.getKey(), (String) extension.getValue());
} else if (extension.getValue() instanceof ArrayList) {
//If instance if ArrayList then loop over it and add it to the JSON after calling recursive method
gen.writeFieldName(extension.getKey());
gen.writeStartObject();
for (Object dupItems : (ArrayList<String>) extension.getValue()) {
if (dupItems instanceof Map) {
recusiveSerializer((Map) dupItems, gen, serializers);
} else {
gen.writeStringField(extension.getKey(), (String) extension.getValue());
}
}
gen.writeEndObject();
}
}
}
}