我正在使用Jersey为服务器组件创建REST Web服务。
我要在列表中序列化的带有JAXB注释的对象如下所示:
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
我有一个REST资源来检索一个看起来像这样的发行版:
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
我还有一个REST资源来检索所有发行版的列表,如下所示:
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
我使用ContextResolver自定义JAXB序列化,当前配置如下:
@Provider
@Produces("application/json")
public class JAXBJSONContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
public JAXBJSONContextResolver() throws Exception {
JSONConfiguration.MappedBuilder b = JSONConfiguration.mapped();
b.nonStrings("id");
b.rootUnwrapping(true);
b.arrays("distribution");
context = new JSONJAXBContext(b.build(), XMLDistribution.class);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
return context;
}
}
REST资源和上下文解析器都可以使用。这是第一个输出的示例:
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
}
这正是我想要的。这是列表的输出示例:
// path: /distributions
{
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
这不是我想要的。
我不明白为什么那里有一个封闭distribution
标签。我想使用.rootUnwrapping(true)
上下文解析器将其删除,但显然,这仅删除了另一个封闭标签。这是带有.rootUnwrapping(false)
以下内容的输出:
// path: /distribution/1
{
"distribution": {
"id": 1,
"name": "Example Distribution"
}
} // not ok
// path: /distributions
{
"xMLDistributions": {
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
}
我还必须配置.arrays("distribution")
为始终获取JSON数组,即使只有一个元素也是如此。
理想情况下,我希望将其作为输出:
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
} // currently works
// path: /distributions
[{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
我试图返回一个List<XMLDistribution>
,XMLDistributionList
(一个围绕列表的包装器),一个XMLDistribution[]
,但是我找不到一种方法来获取所需格式的简单JSON分布数组。
我还尝试了由JSONConfiguration.natural()
,JSONConfiguration.mappedJettison()
等返回的其他符号,但没有得到与我需要的东西相似的东西。
有谁知道是否可以配置JAXB来做到这一点?
我找到了一个解决方案:用性能更好的JSON序列化程序(例如Jackson)替换JAXB JSON序列化程序。简单的方法是使用已经为您完成的jackson-
jaxrs。该类是JacksonJsonProvider。您所要做的就是编辑项目的web.xml,以便Jersey(或另一个JAX-
RS实现)对其进行扫描。这是您需要添加的内容:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value>
</init-param>
这就是全部。Jackson将用于JSON序列化,并且可以按您期望的方式使用列表和数组。
更长的方法是编写您自己的自定义MessageBodyWriter,注册该内容以生成“ application / json”。这是一个例子:
@提供者
@Produces(“ application / json”)
公共类JsonMessageBodyWriter实现MessageBodyWriter {
@Override
public long getSize(Object obj,Class type,Type genericType,
Annotation []批注,MediaType mediaType){
返回-1;
}
@Override
public boolean isWriteable(Class type,Type genericType,
注释注释[],MediaType mediaType){
返回true;
}
@Override
public void writeTo(Object target,Class type,Type genericType,
Annotation []批注,MediaType mediaType,
MultivaluedMap httpHeaders,OutputStream outputStream)
引发IOException {
新的ObjectMapper()。writeValue(outputStream,target);
}
}
与上面的现成解决方案一样,您需要确保web.xml包括该包。
无论哪种方式:瞧!您会看到格式正确的JSON。
您可以从此处下载Jackson:http :
//jackson.codehaus.org/
我使用NewtonSoft.json来反序列化这个json
我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢
我想以 json 格式序列化一个自定义对象,其中 entryData 是我的域对象的列表。像这样: 下面是我在一次尝试中为获得json输出所做的工作: 但结果是entryData评估为字符串,引号转义: 我也尝试过这样做: 但是我得到了这个例外:
问题内容: 我需要反序列化json,它是日期/长值的数组。这是返回的JSON的示例: 使用GSON,我可以将其反序列化为,但希望能够将其转换为类似以下内容的方法: 我似乎找不到一种方法来指示GSON将JSON映射的键/值映射到我的自定义类中的日期/值字段。有没有办法做到这一点,还是地图列表是唯一的路线? 问题答案: 您需要编写一个自定义解串器。您还需要使用可以实际解析的时区格式。无论是也将匹配,这
问题内容: 我正在研究的项目使用JAXB参考实现,即类来自软件包。 我有一堂课: 我想使用JAXB编组器来获取对象的JSON表示形式: 封送处理的数据为XML格式,而不是JSON格式。如何指示 JAXB参考实现 输出JSON? 问题答案: JAXB参考实现不支持JSON,您需要添加一个包,例如Jackson或Moxy 莫西 杰克逊 在这里查看示例
问题内容: 我需要将一些对象序列化为JSON并发送到WebService。如何使用org.json库?否则我将不得不使用另一个?这是我需要序列化的类: 我只放了类的变量和构造函数,但也有getter和setter方法。所以如果有人可以帮忙 问题答案: 没有注释的简单方法是使用Gson库 就那么简单: