Jersey/JAX-RS:以 XML/JSON 格式返回映射

2022-09-02 03:57:31

如何使用 Jersey/JAX-RS 框架将 a 作为 XML/JSON 文档返回并不那么明显。它已经支持s,但是当涉及到s时,没有。即使我将 嵌入到包装类中,XML 架构中也没有类型。MapListMapMessageBodyWriterMamap

关于如何将Map封送到泽西岛的XML / JSON文档中的任何实用建议?


答案 1

我知道回复已经很晚了,但我希望有一天它会帮助某人:)我应用的最简单,最快捷的修复是

@GET
@Path("/{messageId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMessage(@PathParam("messageId") long id) {
    Map<String, String> map = new HashMap<>();
    map.put("1", "abc");
    map.put("2", "def");
    map.put("3", "ghi");

    return Response.status(Status.OK).entity(map).build();
}

输出: { “1”: “abc”, “2”: “def”, “3”: “ghi” }

这绝对可以帮助您解决麻烦。


答案 2

在Java EE 7中做到这一点非常容易。

REST 资源类:

package com.mycompany.maptojson.rest;

import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.enterprise.context.RequestScoped;

@Path("maps")
@RequestScoped
public class MapToJson {

    @GET
    @Produces("application/json")
    public Map getJson() {
       Map<String, String> theMap = new HashMap<>();
       theMap.put("foo", "bar");
       return theMap;
    }
}

这:Application

package com.mycompany.maptojson.rest;

import java.util.Set;
import javax.ws.rs.core.Application;

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        // following code can be used to customize Jersey 2.0 JSON provider:
        try {
            Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature");
            // Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");
            // Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature");
            resources.add(jsonProvider);
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        addRestResourceClasses(resources);
        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(com.mycompany.maptojson.rest.MapToJson.class);
    }
}

如您所见,您可以将不同的类配置为:jsonProvider

Class.forName("org.glassfish.jersey.jackson.JacksonFeature");

Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");

Class.forName("org.glassfish.jersey.jettison.JettisonFeature");

推荐