编程语言
首页 > 编程语言> > java-使用Moxy进行通用Map JSON编组和拆组

java-使用Moxy进行通用Map JSON编组和拆组

作者:互联网

有什么方法可以封送Map< String,Object>.与Moxy转换为JSON,以便结果使用JSON的自然构造?
也就是说,键是字符串,并且对于所有可能的值,遵循以下规则(可能不是完整的规则):

> Number(例如Integer)成为JSON数字(如果太大,则为字符串)
>字符串变成JSON字符串
>设置,数组,可迭代成为JSON数组
>最后,对于Map< String,Object&gt ;,将递归应用相同的规则
>以自然的Moxy方式将任何其他对象编组

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

请注意,Moxy应该能够将JSON解组到原始Map.

杰克逊默认情况下可以执行此操作.

解决方法:

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

标签:unmarshalling,marshalling,moxy,json,java
来源: https://codeday.me/bug/20191028/1952771.html