如何使用Moxy和Jersey从HashMap返回JSON对象

我使用Jersey 2.17和Moxy,我有以下功能:

@Produces(APPLICATION_JSON)
@Restricted
public List<User> getFriends(
        @PathParam("user") String user
) {
    return userDAO.getFriends(user);
}

User.preferences是一个HashMap.

它适用于几乎所有对象,除了HashMap,它被翻译成:

“preferences”:{“entry”:[{“key”:{“type”:”string”,”value”:”language”},”value”:{“type”:”string”,”value”:”en”}},{“key”:{“type”:”string”,”value”:”country”},”value”:{“type”:”string”,”value”:”US”}}]}

但我真正想要返回的只是一个javascript对象,如:

preferences:{“language”:”en”,”country”:”US”}

我怎样才能做到这一点?

最佳答案
是的MOXy和地图不能很好地工作.令人遗憾的是,JSON只不过是映射键/值对.如果要使用MOXy,则需要使用XmlAdapter.在这种情况下,您需要JSON的方式,您需要创建一个具有所有可能首选项名称的类型(类).任意键值对应采用您需要的形式,但由于MOXy无法执行映射,因此您需要将其映射到您自己的类型.例如

public class PreferencesAdapter extends XmlAdapter<Preference, HashMap<String, String>> {

    @XmlRootElement
    public static class Preference {
        public String language;
        public String country;
    }

    @Override
    public HashMap<String, String> unmarshal(Preference p) throws Exception {
        HashMap<String, String> map = new HashMap<>();
        map.put("language", p.language);
        map.put("country", p.country);
        return map;
    }


    @Override
    public Preference marshal(HashMap<String, String> v) throws Exception {
        Preference p = new Preference();
        p.language = v.get("language");
        p.country = v.get("country");
        return p;
    }
}

你的DTO

@XmlRootElement
public class User {
    @XmlJavaTypeAdapter(PreferencesAdapter.class)
    public HashMap<String, String> preferences;
}

但是,如果我们要做所有这些,为什么我们不首先使用Preferences对象而不是Map?这是一个修辞问题.我完全明白你为什么不这样做.但这是MOXy的局限之一,因为它让JAXB陷入困境,而JAXB从来没有与Map很好地合作,这很可悲,就像我说的那样,JSON实际上只不过是关键值的映射.

出于这个原因,以及我过去遇到的其他许多其他人,我不建议使用MOXy,即使它是泽西岛推荐的.相反,使用杰克逊.杰克逊一直是JSON处理的事实上的Java goto.对杰克逊来说,只需使用这种依赖

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
</dependency>

如果你取出MOXy依赖项,这个Jackson模块应该可以解决问题.否则,如果您保留MOXy依赖关系,则需要注册JacksonFeature

转载注明原文:如何使用Moxy和Jersey从HashMap返回JSON对象 - 代码日志