我正在用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"}]}
即内部只有一个对象的数组?
我知道我可以在客户端检测到这一点,但这似乎是一个非常丑陋的黑客。
谢谢你的时间。
也看看下面的答案,它为我解决了它:
如何自定义JAXB对象列表到JSON的序列化?
如果您使用 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;
}
}
我最终使用了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甚至不执行您的代码: