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

Jersey:带有1个元素的Json数组被序列化为对象

宰父志新
2023-03-14

我正在用Jersey/Java创建一个REST服务器,我发现了一个奇怪的行为。

我在服务器上有一个方法,它将对象数组作为Json返回

@GET
@Path("/files")
@Produces(MediaType.APPLICATION_JSON)
public Object getFiles() throws Exception{
    DatabaseManager db = new DatabaseManager();
    FileInfo[] result = db.getFiles();
    return result;
}

代码被正确执行,数据被返回给客户机(一个jQuery ajax调用)。问题是,如果“结果”数组有一个或多个元素,则返回数据的格式会改变。

用一个元素响应:

{"fileInfo":{"fileName":"weather.arff","id":"10"}}

回应有两个要素:

{"fileInfo":[{"fileName":"weather.arff","id":"10"},{"fileName":"supermarket.arff","id":"11"}]}

如您所见,在第一种情况下,返回对象的“fileInfo”属性的值是一个对象,在第二种情况下,该值是一个数组。我做错了什么?第一种情况不应该返回这样的内容吗:

{"fileInfo":[{"fileName":"weather.arff","id":"10"}]}

即内部只有一个对象的数组?

我知道我可以在客户端检测到这一点,但这似乎是一个非常丑陋的黑客。

谢谢你的时间。

共有3个答案

申自明
2023-03-14

也看看下面的答案,它为我解决了它:

如何自定义JAXB对象列表到JSON的序列化?

温星华
2023-03-14

如果您使用 JAXB 构建 JSON 结果,则可以配置 Jersey JSON 处理器以获取更重要的 JSON 格式。

泽西岛官方文件有详细配置:

要实现更重要的JSON格式更改,您需要配置Jersey JSON进程本身。可以在JSONConfiguration实例上设置各种配置选项。然后,可以进一步使用该实例来创建JSONConfigurated JSONJAXBContext,它作为该区域的主要配置点。要将专门的JSONJAXBContext传递给Jersey,您最终需要实现一个JAXBCContext ContextResolver:

    @Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final JAXBContext context;
    private final Set<Class> types;
    private Class[] ctypes = { FileInfo.class}; //your pojo class
    public JAXBContextResolver() throws Exception {
        this.types = new HashSet(Arrays.asList(ctypes));
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(),
                ctypes); //json configuration
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}
何聪
2023-03-14

我最终使用了Jackson,这也在官方的Jersey文档中有所描述(http://jersey.java.net/nonav/documentation/latest/user-guide.html#json.pojo.approach.section).

我以前尝试过,但没有成功,因为我的项目的构建路径中没有jackson jar(根据文档,我认为它被构建到了jersey的核心库中)。

我刚刚添加了 jackson-all.jar 文件 (http://wiki.fasterxml.com/JacksonDownload),并在配置中启用了 POJO 支持

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

瞧!

 类似资料:
  • 问题内容: 我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。 假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters): 我想将看起来像这样的JSON反序列化为User对象: 杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有

  • 问题内容: 使用Jersey和Jackson创建REST接口,当其中包含0或1个元素时,如何将列表字段序列化为列表。例如: 当bar没有元素时,结果序列化为;当它包含单个元素时,结果序列化为该元素,而不是包含单个元素的数组。有没有办法让它们始终序列化为数组? 作为参考,我使用的是Jersey 1.10和Jackson 1.9.2。 问题答案: 我很确定您实际上并没有使用Jackson(JSON序列

  • 问题内容: 有没有办法让Jackson将单个JSON对象解释为具有一个元素的数组,反之亦然? 例如,我有2种略有不同的JSON格式,我需要两者都映射到相同的Java对象: 格式A(带有一个元素的JSON数组): 格式B(JSON对象,是的,我知道它看起来“错误”,但这就是我给的): 以上两种都应转换为的目标Java对象: 当前,只有A可以正确解析为Data。我想避免直接篡改JSON本身。我可以篡改

  • 问题内容: 我正在尝试使用Gson反序列化从Web服务返回的json字符串 该结构将以返回。 哪里像 和ItemDTO就像 当我按如下方式调用代码时 对象内部的所有内容均为空 但是,如果我使用 并将它们从org.json罐子中逐段拉出,效果很好,并相应地填充了字段。 关于我在做什么错的任何想法吗?Gson非常快吗?还是我最好坚持自己已经做的工作​​? 谢谢大卫 问题答案: 原始问题中的示例Java

  • 问题内容: 我正在尝试反序列化(使用gson)如下所示的JSON对象: 我该如何处理?我什至不知道该怎么称呼- 这里代表了多个“项目”,但这不是一个数组。当我尝试将其反序列化为数组时,程序在“预期的Begin_Array但找到Begin_Object”异常时崩溃。当我尝试将其反序列化为Strong对象时(请参见下面的类),程序将运行,但所有字段均返回null。 这是我尝试将其映射到的类: 完整的J

  • 问题内容: 如果我做: 包含一个空对象,而不是iframe元素,为什么? 问题答案: JSON( JavaScript对象 表示法) 不是 为序列化DOM节点 而 设计的,您需要自己拉出所需的内容并将其写入对象,然后根据需要重新创建DOM节点。 实际上,Chrome甚至不执行您的代码: