有没有办法将Map<String, Object>
与Moxy编组到JSON,以便结果使用JSON的自然结构?
也就是说,键是字符串,并且适用于所有可能的值以下规则(可能不是完整的集合):
Number
(例如Integer
)成为JSON号码(如果太大则为字符串)String
成为JSON字符串Set
,数组,Iterable
成为JSON数组Map<String, Object>
,递归应用相同的规则已经有一个示例如何使用Map<String, Integer>
(参见http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html?m=1)来整理@XmlVariableNode
和其他特定地图,但我无法将此想法扩展到也包含子类型的地步可以作为值插入。
请注意,Moxy应该能够将JSON解组回原始Map。
默认情况下杰克逊有能力这样做。
答案 0 :(得分:4)
我试图通过JAXB RI(XML)获得您想要的东西:
@XmlRootElement
public class Foo {
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, Object> map;
}
public class MapAdapter extends XmlAdapter<MapEntry[], Map<String, Object>> {
@Override
public Map<String, Object> unmarshal(MapEntry[] v) throws Exception {
Map<String, Object> map = new HashMap<>();
for (MapEntry me : v)
map.put(me.key, me.value);
return map;
}
@Override
public MapEntry[] marshal(Map<String, Object> v) throws Exception {
MapEntry[] mes = new MapEntry[v.size()];
int i = 0;
for (Map.Entry<String, Object> entry : v.entrySet())
mes[i++] = new MapEntry(entry.getKey(), entry.getValue());
return mes;
}
}
public class MapEntry {
public String key;
public Object value;
public MapEntry() {}
public MapEntry(String key, Object value) {
this.key = key;
this.value = value;
}
}
不幸的是,MOXy有一些错误(https://bugs.eclipse.org/bugs/show_bug.cgi?id=465014)并且无法解决这个问题。
如果您需要MOXy,那么您必须使用Blaise博客中描述的方法:
@XmlRootElement
public class MoxyFoo {
@XmlJavaTypeAdapter(MoxyMapAdapter.class)
public Map<String, Object> map = new HashMap<>();
}
public class MoxyMapAdapter extends XmlAdapter<MoxyMapAdapter.AdaptedMap, Map<String, Object>> {
@Override
public AdaptedMap marshal(Map<String, Object> map) throws Exception {
AdaptedMap adaptedMap = new AdaptedMap();
for (Entry<String, Object> entry : map.entrySet()) {
AdaptedEntry adaptedEntry = new AdaptedEntry();
adaptedEntry.key = entry.getKey();
adaptedEntry.value = entry.getValue();
adaptedMap.entries.add(adaptedEntry);
}
return adaptedMap;
}
@Override
public Map<String, Object> unmarshal(AdaptedMap adaptedMap) throws Exception {
List<AdaptedEntry> adaptedEntries = adaptedMap.entries;
Map<String, Object> map = new HashMap<>(adaptedEntries.size());
for (AdaptedEntry adaptedEntry : adaptedEntries) {
map.put(adaptedEntry.key, adaptedEntry.value);
}
return map;
}
public static class AdaptedMap {
@XmlVariableNode("key")
List<AdaptedEntry> entries = new ArrayList<>();
}
public static class AdaptedEntry {
@XmlTransient
public String key;
@XmlValue
public Object value;
}
}
它适用于XML,但不适用于JSON。对于JSON,现在只有编组工作。我填写了一个修复解组的错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=465016。