jersey学习:响应JSON格式的数据(系列四)
概述
在系列一中,PersonResource的get方法的@Produces采用的MediaType.APPLICATION_XML,即以XML形式输出。
jersey支持的json格式有很多,jackson、moxy、jsonp,以及手动封装json。本篇选择使用jackson输出json数据。
设置@Produces
将get方法的@Produces设置为MediaType.APPLICATION_JSON输出
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Person get(@PathParam("id")Long id,) {
Person p = new Person();
p.setAge(22);
p.setName("bella");
return p;
}
浏览器地址输入http://localhost:9090/jersey/person/1,但是报500错误。查看eclipse的console有这么句话:
严重: MessageBodyWriter not found for media type=application/json, type=class com.bella.jersey.domain.Person, genericType=class com.bella.jersey.domain.Person.
原来是服务器的MessageBodyWriter不能识别MIME类型是json的数据。
解决办法是在ApplicationConfig注册解析json的provider类,这里我使用的jackson-1.9.2.jar(点击下载),将其加入到WEB-INF/lib下
package com.bella.jersey.config;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.glassfish.jersey.server.ResourceConfig;
public class ApplicationConfig extends ResourceConfig{
public ApplicationConfig () {
// 注册JSON解析器
register(JacksonJsonProvider.class);
// 注定resource资源所在包路径
packages("com.bella.jersey.resource");
}
}
重启后,再次访问,居然还在报错!
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.bella.jersey.domain.Person and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
原来是找不到可以序列化的属性,解决办法是Peron类添加@JsonProperty注解,这样jackson就能将对象转化为json
package com.bella.jersey.domain;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.annotate.JsonProperty;
@XmlRootElement
public class Person {
@XmlElement
@JsonProperty
private int age;
@XmlElement
@JsonProperty
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
支持集合类型
返回值类型为list,set,map均可以转换为json。
- list类型
@GET @Path("/get") @Produces(MediaType.APPLICATION_JSON) public List<Person> getList(@MatrixParam("name") List<String> name) { List<Person> personList = new ArrayList<Person>(); for(String n : name) { Person p = new Person(); p.setAge(1); p.setName(n); personList.add(p); } return personList; }地址输入http://localhost:9090/jersey/person/list;name=test1;name=test2,得到期望的结果
[{"age":1,"name":"test1"},{"age":1,"name":"test2"}] - set类型
@GET @Path("/set") @Produces(MediaType.APPLICATION_JSON) public Set<Person> getSet(@MatrixParam("name") List<String> name) { Set<Person> personSet = new HashSet<Person>(); for(String n : name) { Person p = new Person(); p.setAge(1); p.setName(n); personSet.add(p); } return personSet; }地址栏输入http://localhost:9090/jersey/person/set;name=test1;name=test2,得到期望结果
[{"age":1,"name":"test2"},{"age":1,"name":"test1"}] - map类型
@GET @Path("/map") @Produces(MediaType.APPLICATION_JSON) public Map<String, Person> getMap(@MatrixParam("name") List<String> name) { Map<String, Person> map = new HashMap<String, Person>(); for(String n : name) { Person p = new Person(); p.setAge(1); p.setName(n); map.put(n, p); } return map; }地址栏输入http://localhost:9090/jersey/person/map;name=test1;name=test2,得到期望结果
{"test1":{"age":1,"name":"test1"},"test2":{"age":1,"name":"test2"}}
总结
- 若要使用json格式输出,必须在ApplicationConfig中注册解析json的provider
- jersey支持json格式的类型有很多,jackson、moxy、jsonp以及手动封装json
- 返回值为list,set,map均可解析为json

浙公网安备 33010602011771号