如何解决有没有办法使用自定义 XMLAdapter 实现 @XmlPath(".") 的功能?
我正在尝试使用 unmarshal and marshal
POJO
JAXB/Moxy
java 类。 marshaling
工作正常,但 unmarshalling
无法正常工作。经过大量尝试和分析后,我发现它是由于注释 @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>
以下是 Customer
类 POJO:
@XmlRootElement(name = "Customer")
@XmlType(name = "Customer",propOrder = {"name","age","others"})
@XmlAccessorType(XmlAccessType.FIELD)
@NoArgsConstructor
@Getter
@Setter
public class Customer {
private String name;
private String age;
@XmlJavaTypeAdapter(TestAdapter.class)
@JsonSerialize(using = CustomExtensionsSerializer.class)
@XmlPath(".")
private Map<String,Object> others = new HashMap<>();
@JsonAnySetter
public void setOthers(String key,Object value) {
others.put(key,value);
}
}
我想删除 @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;
}
}
以下是我正在使用的 Jackson
searlizer:
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,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(),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,serializers);
} else {
gen.writeStringField(extension.getKey(),(String) extension.getValue());
}
}
gen.writeEndObject();
}
}
}
}
有人可以提供一些关于如何使用 Moxy @XmlPath(".")
获得 XMLAdapter
功能的想法吗?任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。