JSON转化工具的使用

概述

     JSON是一种轻量化的数据传输格式,在各种场景都有运用。比如在ajax中,服务端的数据一般通过JSON字符串的格式传输给前端,前端ajax引擎自动将JSON字符串转化为JS对象(需要将ajax的返回内容格式设置为"json")。那么此时我们在后台服务器中就需要将封装好的JavaBean对象转化为JSON格式字符串来传输给前台ajax引擎,此时使用JSON转化工具将大大简化我们代码量。

首先我们需要明确的是什么是JSON格式

     JSON格式有两种,一种是对象格式,另一种是数组格式(也可以叫集合)。    

  • 对象格式:{"key1":value1,"key2":value2......}
  • 数组形式:[{对象1},{对象2}....]

   需要注意的是

  1. 这里的value可以是字符串形式,也可以是数值形式,还可以是布尔型(除了字符串形式需要打引号,其他两种都不用打)
  2. JSON严格的规定中,key是必须打双引号的,不能为单引号,所以在java代码手动连接JSON字符串时需要用转义字符。
  3. 虽然在跟多环境中兼容key不打引号的JSON格式,但为了在所有环境下兼容我们还是都加上双引号吧。                     

JSON转换工具的使用

 

    一. GSON转换工具的使用

  1. 在使用之前我们需要引入所需的jar包(gson-2.2.4.jar)。
  2. 创建Gson对象。
  3. 调用该对象的toJson()方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		CategoryService service=new CategoryService();
		List<Category> list=service.getCategoryList();
		//创建Gson对象
		Gson gson=new Gson();
		//调用toJson()方法
		String json = gson.toJson(list);
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write(json);
	}

二.JSONLib转换工具的使用

使用前需要导的包:

1.获取JSON字符串中的属性值(字符串->java对象)

public class Hello {
	@Test
	public void test() {
		String jsonStr="{\"id\":\"123\",\"name\":\"tom\"}";
		JSONObject json = JSONObject.fromObject(jsonStr);
		int id = json.getInt("id");
		String name=json.getString("name");
	}
}

 

2.将Java对象转换成JSON字符串(java对象->字符串)

在演示之前我们给出一个JavaBean对象(省略get和set方法):

public class User {
	private Long uid;
	private String email;
	private Long initSize;
	
    //get和set方法省略
}

     2.1 将List集合转换成JSON字符串数组形式(使用JSONArray对象)

public class Hello {
	@Test
	public void test() {
		List<User> list=new ArrayList<>();
		User u1 = new User();
		u1.setUid(1L);
		u1.setEmail("1@qq.com");
		list.add(u1);
		
		User u2=new User();
		u2.setUid(2L);
		u2.setEmail("2@qq.com");
		list.add(u2);
		
             //将List转换成Json字符串
		JSONArray json = JSONArray.fromObject(list);
		String jsonStr=json.toString();

		System.out.println(jsonStr);
	}
}

输出结果:

 

     2.2将JavaBean对象转换成JSON字符串对象形式(使用JSONObject方法)

public class Hello {
	@Test
	public void test() {
		User u = new User();
		u.setUid(1L);
		u.setEmail("1@qq.com");
		
		JSONArray json = JSONArray.fromObject(u);
		String jsonStr=json.toString();
		
		System.out.println(jsonStr);
	}
}

输出结果:

 

   2.3.将现有对象转换成JSON字符串时,添加排除属性

在某些情况下,我们转换对象中不是所有属性都需要转换成JSON字符串中,此时我们只需要添加排除即可。例如在2.1和2.2中User对象中的initSize属性,我们不需要转换成字符串,我们只需要这么做。
 

public class Hello {
	@Test
	public void test() {
		User u = new User();
		u.setUid(1L);
		u.setEmail("1@qq.com");
		
		//添加排除
		JsonConfig config=new JsonConfig();
		config.setExcludes(new String[] {"initSize"});
		
		JSONObject json = JSONObject.fromObject(u,config);
		String jsonStr=json.toString();
		
		System.out.println(jsonStr);
	}
}

输出结果:

注:这里添加的排除,不是只对当前层级的Java对象有用,对当前层级中引用的其他对象中的属性同样有用。在有的Java对象中我们可能会封装引用类型的属性,也有可能多个对象的互相引用。在转换时会由于形成了死循环而报错。此时必须添加排除,破坏原先的循环嵌套才能成功转换。

Java对象的嵌套循环导致转换失败的问题,详见博主另一篇文章:

在SSH框架中,多个持久层对象相互引用,从而引发分页查询中,查询所得的持久化对象转换为JSON字符串报错的原因及解决方案

 

FastJSON使用

在演示FastJSON的操作之前,我们先给出后面需要用到两个实体类(其中getter和setter方法省略):

public class User {
	private String name;
	private int age;

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}
public class UserGroup {
	private String name;
	private List<User> users = new ArrayList<User>();

	@Override
	public String toString() {
		return "UserGroup [name=" + name + ", users=" + users + "]";
	}
}

一. 对象序列化

所谓序列化就是将对象转换成字符串

// 序列化
	@Test
	public void testObjectToJson() throws Exception {
		User user1 = new User();
		user1.setName("张三");
		user1.setAge(12);

		// {"age":12,"name":"张三"}
		String json = JSON.toJSONString(user1);
		System.out.println(json);
	}

	@Test
	public void testObjectToArray() throws Exception {
		User user1 = new User();
		user1.setName("张三");
		user1.setAge(12);

		User user2 = new User();
		user2.setName("李四");
		user2.setAge(12);

		List<User> list = new ArrayList<User>();
		list.add(user1);
		list.add(user2);

		UserGroup group = new UserGroup();
		group.setUsers(list);
		group.setName("root");

		// 将List转成JSON
		// [{"age":12,"name":"张三"},{"age":12,"name":"李四"}]
		String json = JSON.toJSONString(list);
		System.out.println(json);

		// 将UserGroup转换成Json
		// {"name":"root","users":[{"age":12,"name":"张三"},{"age":12,"name":"李四"}]}
		String json2 = JSON.toJSONString(group);
		System.out.println(json2);
	}

二. 定制序列化

// 定制序列化
//如果age属性<18,则在序列化时不显示该属性
	@Test
	public void testPrtopertyJson() throws Exception {

		PropertyFilter filter = new PropertyFilter() {
			@Override
			public boolean apply(Object object, String name, Object value) {
				// 如果age属性<18,则在序列化时不显示该属性
				if (name.equals("age")) {
					if ((Integer) value < 18) {
						return false;
					}
				}
				return true;
			}
		};
		User user1 = new User();
		user1.setName("张三");
		user1.setAge(18);
		String jsonString = JSON.toJSONString(user1, filter);
		System.out.println(jsonString);
	}

三. 反序列化

// 反序列化为对象
	@Test
	public void testJsonToObj() throws Exception {
		String json = "{\"age\":12,\"name\":\"张三\"}";
		// JSON会尽最大可能转换成User对象
		User user = JSON.parseObject(json, User.class);
		System.out.println(user);
	}

	// 反序列化为集合
	@Test
	public void testJsonToList() {
		String json = "[{\"age\":12,\"name\":\"张三\"},{\"age\":12,\"name\":\"李四\"}]";
		List<User> list = JSON.parseArray(json, User.class);
		System.out.println(list);
	}

	// 反序列化为对象,对象里面包含List集合
	@Test
	public void testJsonToObj2() throws Exception {
		String json = "{\"name\":\"root\",\"users\":[{\"age\":12,\"name\":\"张三\"},{\"age\":12,\"name\":\"李四\"}]}";
		UserGroup group = JSON.parseObject(json, UserGroup.class);
		System.out.println(group);

	}

 

posted @ 2018-06-04 21:33  听到微笑  阅读(0)  评论(0编辑  收藏  举报  来源