gpt4 book ai didi

java - Generic Map 使用 Moxy 进行 JSON 编码和解码

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:28 25 4
gpt4 key购买 nike

有没有办法编码Map<String, Object>使用 Moxy 转换为 JSON,以便结果使用 JSON 的自然结构?
也就是说, 是字符串,并且对于所有可能的 都适用以下规则(可能不是完整的集合):

  • Number (例如,Integer)变成一个 JSON 数字(如果它太大,则变成一个字符串)
  • String变成一个JSON字符串
  • Set , 数组, Iterable成为一个JSON数组
  • 最后是 Map<String, Object> , 递归应用相同的规则
  • 任何其他对象都以自然的 Moxy 方式编码

已经有一个例子如何编码Map<String, Integer>和其他特定 map 使用 @XmlVariableNode (参见 http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html?m=1 ),但我无法将这个想法扩展到子类型也可以作为值插入的地步。

请注意,Moxy 应该能够将 JSON 解码回原始 Map。

默认情况下,Jackson 能够执行此操作。

最佳答案

我已经尝试使用 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 .

关于java - Generic Map<String, Object> 使用 Moxy 进行 JSON 编码和解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29549370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com