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

强制JAX-RS将我的类序列化为JSON对象

姜永贞
2023-03-14

我有一个班级,它是一个装饰围绕一个内部列表。我想在我的JAX-RS服务中使用这个类作为DTO。其代码如下:

@XmlRootElement(name = "movies")
public class MoviesResponse implements List<Movie> {

    @XmlElement(name = "movie")
    protected List<Movie> movies;

    /* tons of delegate methods */

}

我需要同时支持application/xml和application/json。格式是固定的,它必须像

<movies>
 <movie>
  <foo />
 </movie>
 <movie>
  <foo /> 
 </movie>
</movies>

...XML格式,并且

{
 "movie": [
 {},{}
 ]
}

...在JSON中。XML工作得非常好,但JSON看起来是这样的:

[{},{}]

正如您可能怀疑的那样,如果我不实现列表接口,它会生成我需要的格式。所以我想序列化器是聪明的,将其作为列表处理,从而将其序列化为数组。但我需要将它序列化为一个对象。如何实现列表接口?

共有1个答案

金令秋
2023-03-14

假设Jackson是您的序列化器,您可以将objectmapper配置为wrap_root_value。您可以在ContextResolver中执行此操作。为了不对所有类型使用相同的配置,您可以使用两个不同的配置objectmapper,一个用于list类,另一个用于其余类型。例如:

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

    final ObjectMapper listMapper = new ObjectMapper();
    final ObjectMapper defaultMapper = new ObjectMapper();

    public ObjectMapperContextResolver() {
        listMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        listMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);

        listMapper.registerModule(new JaxbAnnotationModule());
        defaultMapper.registerModule(new JaxbAnnotationModule());
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        if (type == MovieList.class) {
            return listMapper;
        }
        return defaultMapper;
    }  
}

用于封送的MessageBodyWriter调用GetContext方法,传入它试图封送的类。根据结果,将使用objectmapperWRAP_ROOT_VALUE所做的是将根值包装在对象中,其名称是@JSONROOTNAME@XMLROOTELEMENT中的值(给定启用了JAXB注释支持-参见此处)

测试:

@Path("/movies")
public class MovieResource {

    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response getMovieList() {
        MovieList list = new MovieList();
        list.add(new Movie("I Origins"));
        list.add(new Movie("Imitation Game"));
        return Response.ok(list).build();
    }
}

C:\>curl-v-h“accept:application/json”http://localhost:8080/api/movies
结果:
{“movies”:[{“name”:“i origins”},{“name”:“imilition game”}]}

所以我注意到您的列表是protected。也许您稍后会希望扩展movieList类。在这种情况下,此

if (type == MovieList.class) {
    return listMapper;
}

bot是可行的。相反,您需要检查isassignablefrom类型

if (MovieList.class.isAssignableFrom(type)) {
    return listMapper;
}
 类似资料:
  • 问题内容: 我有一个类,它是一个内部列表周围的装饰器。我想在我的JAX-RS服务中将此类用作DTO。其代码如下: 我需要同时支持application / xml和application / json。格式是固定的,必须像 …以XML格式,以及 …在JSON中。XML可以很好地工作,但是JSON看起来像这样: 您可能会怀疑,如果我不实现List接口,它将生成我需要的格式。因此,我认为序列化器很聪明

  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 问题内容: 因此,当我偶然发现新的JsonSerializable Interface 时,我在php.net上四处徘徊,以获取有关将PHP对象序列化为JSON的信息。它只是 PHP > = 5.4,而我正在5.3.x环境中运行。 PHP <5.4如何实现这种功能? 我还没有使用JSON进行很多工作,但是我试图在应用程序中支持API层,并且将数据对象( 否则将发送到视图 )转储到JSON中将是完美

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,

  • 问题内容: 我需要将一些对象序列化为JSON并发送到WebService。如何使用org.json库?否则我将不得不使用另一个?这是我需要序列化的类: 我只放了类的变量和构造函数,但也有getter和setter方法。所以如果有人可以帮忙 问题答案: 没有注释的简单方法是使用Gson库 就那么简单:

  • 问题内容: 我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像以下内容: 当从服务器提取字符串时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?还是我必须手动拆分字符串并手动构建对象? 问题答案: 现代浏览器支持。 在不浏览器,您可以包括在库中。