JSON的学习及JackJson与FastJson的性能比较

1. JSON数据格式

为了更好的实现“服务器端向客户端响应数据”,能够满足各种不同的数据格式要求,应该将服务器端响应的内容有规则的组织起来,例如,可以使用XML语法来组织数据:

<result>
	<state>1</state>
	<message>登录成功</message>
</result>

或:

<result>
	<state>2</state>
	<message>您输入的用户名XXX不存在!</message>
</result>

或:

<result>
	<state>1</state>
	<data>
		<user>
			<id>1</id>
			<username>Mike</username>
			<password>1234</password>
		</user>
		<user>
			<id>2</id>
			<username>Jack</username>
			<password>1234</password>
		</user>
		<user>
			<id>3</id>
			<username>Lucy</username>
			<password>1234</password>
		</user>
	</data>
</result>

但是,使用XML来组织数据也存在一定的问题:

  1. 解析难度略大;
  2. 节点产生的不必要数据太多。

当前,主流的解决方案是使用JSON格式来组织数据:

{
	"state":1,
	"message":"登录成功"
}

或:

{
	"state":2,
	"message":"您输入的用户名XXX不存在!"
}

或:

{
	"state":1,
	"data":[
		{
			"id":1,
			"username":"Mike",
			"password":"1234"
		},
		{
			"id":2,
			"username":"Jack",
			"password":"1234"
		},
		{
			"id":3,
			"username":"Lucy",
			"password":"1234"
		}
	]
}

可以看到,JSON的基本语法格式是:

  1. 整个JSON数据使用一对大括号框住;
  2. 可以有若干个属性与值的配置,属性与值之间使用冒号分隔,多个属性的配置之间使用逗号分隔,属性名应该使用双引号框住,属性的值如果是数值或布尔值可以直接写,如果是字符串则需要使用双引号框住。
  3. JSON中也可以有数据,使用[]框住数组数据,数组中的各元素之间使用逗号进行分隔;
  4. JSON中也可以有对象,甚至整个JSON数据就是一个对象,所有对象都应该使用{}框住,各属性的配置之间使用逗号分隔;
  5. 以上各种不同的配置之间可以组合,例如数组的元素可以是对象,而对象中某属性的值也可以是数组。

2. 服务器响应JSON数据

通常,服务器向客户端响应的数据都会包括几项内容:

  1. 状态码:服务器与客户端约定某个数值表示某种意义,例如约定1表示操作成功,0表示操作失败,或其它数字表示某种意义;
  2. 消息:通常是对操作失败时的错误的描述,用于被客户端用于提示用户;
  3. 数据:某些请求的目标只是希望得到操作成功与否的结果,例如登录、注册等,而某些请求的目标是希望获取数据的,例如显示用户列表等,对于获取数据的请求,则应该专门给予数据;

为了设计一个通用的响应的类型,可以:

public class ResponseResult<E> {
	private Integer state;
	private String message;
	private E data;
	// SET/GET,Serialiazable
}

然后,添加Jackson依赖(或者FastJson):

<!-- Jackson -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.8</version>
</dependency>

最后,将处理请求的方法的返回值类型修改为ResponseResult类型,并且,在方法体中,根据不同的登录结果,为ResponseResult中的属性赋予不同的值即可:

@RequestMapping("/handle_login.do")
@ResponseBody
public ResponseResult<Void> handleLogin(
		String username, String password) {
	ResponseResult<Void> rr
		= new ResponseResult<Void>();
	if ("root".equals(username)) {
		if ("1234".equals(password)) {
			// 登录成功
			rr.setState(1);
			rr.setMessage("登录成功");
		} else {
			// 密码错
			rr.setState(2);
			rr.setMessage("密码错");
		}
	} else {
		// 用户名错
		rr.setState(3);
		rr.setMessage("用户名错");
	}
	return rr;
}

在SpringMVC框架中,当响应正文时(方法添加了@ResponseBody时),框架会根据方法的返回值类型寻找匹配的转换器,框架本身支持多款转换器,所以,会一一尝试,直到找到匹配的,例如返回String类型,就会使用内置的字符串的转换器(StringHttpMessageConverter),当把返回值声明为自定义的ResponseResult时,SpringMVC框架默认并没有内置相关的转换器,就会自动Jackson(Jackson中包括支持任何类型的转换器),而Jackson中的转换器的工作模式就是将响应的对象转换为JSON格式的字符串,并且,在响应头(Response Headers)中设置响应内容为application/json,charset=utf8

3. 在Javascript中访问JSON数据

Javascript是默认直接识别JSON数据的,不需要编写特殊的解析程序。

假设存在:

var json = { 
	"state":1, 
	"message":"登录成功!", 
	"data": [
		{
			"id":31,
			"username":"Jack",
			"password":"123456"
		}, 
		{
			"id":35,
			"username":"Lucy",
			"password":"888888"
		}, 
		{
			"id":36,
			"username":"Mike",
			"password":"654321"
		}
	]
};

通过json.state即可以访问到"state"属性的值,同理,通过json.message就可以访问到"message"属性的值,由于"data"属性的值的类型是数组,直接访问时,会显示为数组元素的输出,应该通过例如json.data[1]访问其中的某个元素,当然,该数组中的元素都是JSON对象,可以继续向下访问其中的某个属性,例如json.data[1].username即可获取到"Lucy"值。

在JSON中的数组也是可以循环或遍历的:

for (var i = 0; i < json.data.length; i++) {
	console.log(json.data[i].id);
	console.log(json.data[i].username);
	console.log(json.data[i].password);
	console.log("");
}

但是,在绝大部分情况下,获取到的JSON数据可能并不是一个JSON对象,而只是符合JSON语法的字符串而已,所以,还需要通过JSON.parse()函数将字符串转换为JSON对象:

var json = JSON.parse(str);

不同数据类型返回的JSON数据格式

JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较

JackJson与FastJson的性能比较

开始测试,用一个map往里面装10万个键值对,结果jackson速度快于fastjson,jackson大约只用了fastjson一半的时间。
JSON学习及JackJson与FastJson的性能比较

这次我们把ObjectMapper实例化部分也纳入计时,这次情况有变化了,fastJson明显比jsckson快了,请看代码(ObjectMapper实例化放到endTime下面)
JSON学习及JackJson与FastJson的性能比较

JSONObject与JSONArray的区别及转换

JSON学习及JackJson与FastJson的性能比较
JSON学习及JackJson与FastJson的性能比较

相关文章: