Java.util.Map to JSON Object with Jersey / JAXB / Jackson

2022-09-01 17:26:54

我一直在尝试创建一个泽西岛REST Webservice。我想从Java类接收和发出JSON对象,如下所示:

@XmlRootElement
public class Book {

    public String code;

    public HashMap<String, String> names;

}

这应该转换为JSON,如下所示:

{
    "code": "ABC123",
    "names": {
        "de": "Die fabelhafte Welt der Amelie",
        "fr": "Le fabuleux destin d'Amelie Poulain"
    }
}

但是,我找不到标准的解决方案。每个人似乎都在实现自己的包装器解决方案。这一要求在我看来是非常基本的。我不敢相信这是普遍接受的解决方案,特别是因为泽西岛确实是Java中更有趣的部分之一。

我也尝试过升级到Jackson 1.8,它只给了我这个,这是极端混淆的JSON:

{
    "code": "ABC123",
    "names": {
        "entry": [{
            "key": "de",
            "value": "Die fabelhafte Welt der Amelie"
        },
        {
            "key": "fr",
            "value": "Le fabuleux destin d'Amelie Poulain"
        }]
    }
}

对此,是否有任何建议的解决方案?


答案 1

我不知道为什么这不是默认设置,我花了一段时间才弄清楚,但是如果你想用泽西岛进行JSON转换,请添加

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

到你的网络.xml,你所有的问题都应该得到解决。

PS:您还需要摆脱注释以使其正常工作@XmlRootElement


答案 2

你可以使用谷歌-gson。下面是一个示例代码:

    @Test
    public void testGson(){
       Book book = new Book();
       book.code = "1234";
       book.names = new HashMap<String,String>();
       book.names.put("Manish", "Pandit");
       book.names.put("Some","Name");
       String json = new Gson().toJson(book);
       System.out.println(json);
   }

输出为{"code":"1234","names":{"Some":"Name","Manish":"Pandit"}}