我有一个使用Jersey实现的JAX-RS REST服务.JAX-RS/Jersey的一个很酷的功能就是如何轻松地将POJO变成REST服务,只需简单地添加一些Java注释......包括一个简单的机制,用于将POJO转换为JSON - 使用JAXB注释.
现在,我希望能够利用这种非常酷的JSON-ifying功能用于非REST目的 - 我希望能够将这些对象中的一些序列化为磁盘,作为JSON文本.这是我想要序列化的示例JAXB对象:
@XmlRootElement(name = "user")
public class UserInfoImpl implements UserInfo {
public UserInfoImpl() {}
public UserInfoImpl(String user, String details) {
this.user = user;
this.details = details;
}
public String getUser() { return user; }
public void setUser(String user) { this.user = user; }
public String getDetails() { return details; }
public void setDetails(String details) { this.details = details; }
private String user;
private String details;
}
Run Code Online (Sandbox Code Playgroud)
泽西可以将其中一个变成json而没有额外的信息.我想知道泽西是否已经在API中公开了这个功能,以满足我的需求?到目前为止我找不到运气了......
谢谢!
更新2009-07-09:我已经了解到我可以使用Providers对象几乎完全按照我的意愿行事:
@Context Providers ps; …Run Code Online (Sandbox Code Playgroud) 使用 Jersey 和 Jackson 创建 REST 接口,当列表字段中有 0 或 1 个元素时,如何将列表字段序列化为列表。例如:
@XmlRootElement(name="foo")
public class Foo {
@XmlElement
public List<Bar> getBars() {
return this.bars;
}
}
@Path("foo")
public FooResource {
@GET
public Foo getFoo() {
return theFoo;
}
}
Run Code Online (Sandbox Code Playgroud)
当 bar 没有元素时,结果序列化为null,当它包含单个元素时,它序列化为该元素,而不是包含单个元素的数组。有没有办法让这些总是序列化为数组?
作为参考,我使用的是 Jersey 1.10 和 Jackson 1.9.2。
我使用JAXB创建的数据模型,我可以直接生成XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<artist-list offset="0" count="1">
<artist ext:score="100" type="Group" id="4302e264-1cf0-4d1f-aca7-2a6f89e34b36">
<name>Farming Incident</name>
<ipi-list>
<ipi>1001</ipi>
</ipi-list>
</artist>
</artist-list>
</metadata>
Run Code Online (Sandbox Code Playgroud)
并且在Jersey的帮助下也使用Natural表示法生成JSon
"artist-list":
{"offset":0,
"count":1,
"artist":[
{"score":"100",
"type":"Group",
"id":"4302e264-1cf0-4d1faca7-2a6f89e34b36",
"name":"Farming Incident",
"ipi-list":
{
"ipi":[
"1001"
]
}
}]
}
Run Code Online (Sandbox Code Playgroud)
Xml很好,json几乎没有问题,因为Json直接支持具有像ipi-list和artist-list这样的元素的数组似乎不是json,是否有可能从我的模型生成更多类似json的json?
请求 的附加信息 json是使用JAXB和Jersey 从这个MMD模式http://svn.musicbrainz.org/mmd-schema/trunk/brainz-mmd2-jaxb/src/main/resources/musicbrainz_mmd-2.0.xsd生成的 ,请参阅 http://svn.musicbrainz.org/search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java和 http://svn.musicbrainz.org/search_server/trunk /servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
关键是我希望能够从一个模式生成Json和XML,但是显然Json看起来不对,所以我正在寻找一种方法来改进它(我真的没有任何经验我自己)
我们有一个Java列表的对象,它是通过泽西创建的JSON编组的.
List被称为"行".当有数据我们有:
{"records":"1","page":"1","total":"1","rows":[{"id":"692334","cell":["ECS","D","201009","","0","ABCD","11","11","","201009"]}]}
Run Code Online (Sandbox Code Playgroud)
当我们没有数据时:
{"page":0,"records":0,"total":0}
Run Code Online (Sandbox Code Playgroud)
rows即使列表的大小为0,我们怎样才能使泽西包括该字段?我们想要的是:
{"page":0,"records":0,"total":0,"rows":[]}
Run Code Online (Sandbox Code Playgroud)
请注意,我们已经在使用JAXB ContextResolver来确保单行的JSON正确.不确定我们是否可以配置此解析器来解决我们的问题.
我正在使用Jersey为服务构建REST API.我希望能够接受并返回JSON和XML,并且主要使用它,但我不喜欢Jersey喜欢吐出的JSON的默认"映射"风格.
我知道更新的"自然"符号(来自http://jersey.java.net/nonav/documentation/latest/json.html,我会详细引用它,因为它显然存在默认"映射"的问题符号):
在使用映射的JSON表示法一段时间后,很明显,需要手动配置所有各种事情可能有点问题.为了避免手动工作,在Jersey版本1.0.2中引入了一种新的,自然的JSON表示法.使用自然符号,Jersey会自动确定需要处理的各个项目,因此您无需进行任何类型的手动配置.Java数组和列表映射到JSON数组,即使对于单元素情况也是如此.Java数字和布尔值正确映射到JSON数字和布尔值,你不需要打扰XML属性,就像在JSON中一样,它们保留原始名称
并且想在任何地方使用它,但我无法弄清楚如何使用它.我通过Tomcat的XML配置文件实例化/配置Jersey - 使用我认为是与servlet/servlet-class/init-param标签的正常舞蹈 - 但是我无法找到关于它是否或如何的文档可以从那里指定JSONConfiguration选项.
我也尝试实现自己的ContextResolver,它应用了我从Java代码实例化的JSONJAXBContext,我可以在其中应用JSONConfiguration.natural()(这个例子就像这个答案).这是有效的,但仅适用于我在该代码中明确列出的类型,并传递给JSONJAXBContext构造函数.这个额外的代码不仅可以编写和维护,而且如果我添加更多的数据类也会更改,但它不适用于像List这样的东西.
有没有办法告诉泽西岛只使用自然符号而不是映射符号,总是和所有类型?