使用Eclipselink MOXy,我有以下课程:
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name = "")
public class MyObject {
private Map<String, String> meta;
@XmlPath(".")
@XmlJavaTypeAdapter(MetaMapAdapter.class)
public Map<String, String> getMeta() {
return meta;
}
public setMeta(Map<String, String> m) {
meta = m;
}
}
我的AdaptedMap看起来像这样(归功于JAXB: how to marshall map into <key>value</key>):
import javax.xml.bind.annotation.XmlAnyElement;
public class AdaptedMap {
private Object value;
public AdaptedMap() {}
@XmlAnyElement
public Object getValue() { return value; }
public void setValue(final Object value) { this.value = value; }
}
MapAdapter看起来像这样(归功于JAXB: how to marshall map into <key>value</key>):
import java.util.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.parsers.*;
import org.eclipse.persistence.oxm.XMLRoot;
import org.w3c.dom.*;
public class MetaMapAdapter extends XmlAdapter<AdaptedMap, Map<String, String>> {
public MapAdapter() {}
@Override public AdaptedMap marshal(final Map<String, String> map) throws Exception {
if (map == null) { return null; }
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final Document document = db.newDocument();
final Element rootElement = document.createElement(getTagName());
document.appendChild(rootElement);
for (final Entry<String, String> entry : map.entrySet()) {
final Element mapElement = document.createElement(entry.getKey());
mapElement.setTextContent(entry.getValue());
rootElement.appendChild(mapElement);
}
final AdaptedMap adaptedMap = new AdaptedMap();
adaptedMap.setValue(document);
return adaptedMap;
}
@Override public Map<String, String> unmarshal(final AdaptedMap adaptedMap) {
if (adaptedMap == null) { return null; }
final Map<String, String> map = new HashMap<String, String>();
final Element rootElement = (Element) adaptedMap.getValue();
final NodeList childNodes = rootElement.getChildNodes();
for (int x = 0, size = childNodes.getLength(); x < size; x++) {
final Node childNode = childNodes.item(x);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
map.put(childNode.getLocalName(), childNode.getTextContent());
}
}
return map;
}
}
通过使用Eclipselink MOXy,我可以在XmlPath的帮助下获得此JSON:
{
"meta": {
"akey":"avalue",
"bkey":"bvalue"
}
}
不幸的是,由于使用XmlPath来折叠外元元素,我无法反向解组MyObject。
另一方面,我也无法在Eclipselink 2.6中使用新的XmlVariableNode,因为我只允许使用API的稳定版本:(
任何人都知道如何解决这个问题?
答案 0 :(得分:3)
另一方面,我也无法使用新的XmlVariableNode Eclipselink 2.6因为我只允许使用API的稳定版本 :(
@XmlVariableNode
也包含在EclipseLink 2.5.1中,现已发布:
此注释非常适合映射您的用例: