当前位置: 首页 > 知识库问答 >
问题:

通用映射JSON封送和用Moxy解封

云胤
2023-03-14
    null

杰克逊在默认情况下有能力做到这一点。

共有1个答案

夏英发
2023-03-14

我试图通过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有一些bug(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;
    }
}
 类似资料:
  • 我在我的Jersey(2.7)项目中使用Moxy,基本上只是为了在服务发出响应时将我的对象整理为JSON。它工作得很好,但现在我也在使用ContainerResponseFilter对发出的每个响应进行一些更改,我不确定如何将请求体的内容解组到一个对象中,这是我需要的。 但我不确定是否有可能将它自动转换为一个对象。我需要的信息比较简单,所以我想我可以用另一种方式解析JSON,但我很好奇。 我试过找

  • 我正在尝试封送和取消封送映射到值对/从值对。我可以成功封送该对象,但是,我不能从XML中取消封送它。反封送结果是映射中存在的关键字,但其值为空。 下面是我要封送和取消封送的模型: 而且我还发现了一个关于这个问题的类似问题“JAXB:如何将映射编入 value ”,然而,它并没有解决解编组问题?

  • 我正在使用Jersey Web services(2.23),并将POJO映射用于JSON到对象的映射(Jersey-media-moxy)。我创建了一个类,如下所示: 我希望该对象的实例具有以下结构:

  • 我有以下类型,在架构中定义为: 生成的JAXB类: 使用此类型的一些JAXB类: 当我将此XML解组为JAXB对象时: 这份名单从何而来?info_analytics映射到没有任何集合/数组的类型。 如果我得到这个JSON,umarshall将其转换为JAXB对象,marshall转换为XML,它将生成: 为什么元素作为属性重复? XML:

  • 我在使用Jersey客户端(1.11)和JSONConfiguration时遇到了一些问题。要素映射设置为true。我的测试代码如下所示: 在服务器上: 1) 我的网络。xml的POJO映射设置为true。 2) MyFooDTO只是一个如下所示的POJO: 3) MyFooCollectionWrapper如下所示: 我已经验证了服务器在创建Json响应时没有问题。如果将响应类型设置为Strin