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。

  1. 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"}]
  2. 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"}]
  3. 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"}}

总结

  1. 若要使用json格式输出,必须在ApplicationConfig中注册解析json的provider
  2. jersey支持json格式的类型有很多,jackson、moxy、jsonp以及手动封装json
  3. 返回值为list,set,map均可解析为json
posted @ 2016-03-03 14:50  贝拉巴拉  阅读(1474)  评论(0)    收藏  举报