`

4种JSON解析对比及实例

阅读更多

一 、JSON类库简介和优劣

1、json-lib

json-lib性能和功能都没有什么亮点,最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,

commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。

json-lib在功能和性能上面都不能满足现在互联网化的需求。

2、Gson(Google

Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员
才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
3、FastJson(阿里巴巴)

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库
这里要说的就是它的功能性问题。可能是定位不一样,最初fastjson就是要快,因此在对象的序列化与反序列化上下了很大功夫。但是在功能上有所缺乏。
不知在哪个版本开始加上了key按字典排序的功能。但是貌似这个功能没有办法关闭。有些时候我是不希望字段顺序被打乱的,这个问题就无法解决。
我使用的fastjson版本为1.1.14。另外fastjson还有一些bug没有解决,而且是比较明显的bug。例如在@JsonField 注解中format参数,这个是用来指定Date类型数据如何序列化的。如果你使用英文或符号,OK,没有问题(例如yyyy-MM-dd),

但是格式中一旦出现中文就会出错(例如yyyy年MM月dd日)。而且经过实验,所有的注解都要放在属性的Getter(就是getXXX()方法)上,直接放在属性上是无法工作的。

在eclipse中,一般我们都是直接写属性,属性写完后用自动生成的方式生成Getter和Setter方法。如果今后该类的属性发生变化了,个人更倾向于直接删除所有Getter和Setter,然后重新生成。那么假如把注解全放到Getter上面,我删的时候就要非常小心。
再有一个比较致命的就是文档。几乎找不到全面的文档来介绍或支持fastjson。存在很多不确定的因素。
4、Jackson

首先说文档,Jackson Json项目主页上对每一个版本都有详尽的文档(http://jackson.codehaus.org/)。另外Jackson Json的序列化与反序列化速度也并不见得有多慢。更重要的是它的注解支持要好于fastjson。

就拿刚才说到的key按字典排序的功能吧,可以在实体类上直接加上@JsonPropertyOrder(alphabetic=false)注解就可以关闭排序功能。而对于其他功能的注解支持也很好。

二 、实例

1、json-lib

 

package com.its.test.util.json.entity;

import java.util.Date;
import java.util.List;

public class User {

	private Integer id;
	private String name;
	private int age;
	private String sex;
	private Date birthday = new Date();
	private List<Role> roles;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public List<Role> getRoles() {
		return roles;
	}

	public void setRoles(List<Role> roles) {
		this.roles = roles;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}
 

 

 

package com.its.test.util.json.entity;

public class Role {

	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
 
package com.its.test.util.json;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.its.model.dao.domain.Department;
import com.its.test.util.json.entity.Role;
import com.its.test.util.json.entity.User;
import net.sf.json.JSONArray;
import net.sf.json.JSONFunction;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.PropertyFilter;
import net.sf.json.xml.XMLSerializer;

/**
 * 用json-lib转换java对象到JSON字符串 读取json字符串到java对象,序列化jsonObject到xml
 * json-lib-version: json-lib-2.3-jdk15.jar 依赖包: commons-beanutils.jar
 * commons-collections-3.2.jar ezmorph-1.0.3.jar commons-lang.jar
 * commons-logging.jar
 */
public class JsonlibTest {
	private JSONArray jsonArray = null;
	private JSONObject jsonObject = null;

	private User bean = null;

	@Before
	public void init() {
		jsonArray = new JSONArray();
		jsonObject = new JSONObject();
		bean = new User();
		bean.setId(1);
		bean.setName("Test");
		bean.setAge(20);
		bean.setSex("1");
		bean.setBirthday(new Date());
		Role role = new Role();
		role.setId(1);
		role.setName("角色1");
		Role role2 = new Role();
		role2.setId(2);
		role2.setName("角色2");
		List<Role> roles = new ArrayList<Role>();
		roles.add(role);
		roles.add(role2);
		bean.setRoles(roles);
	}

	@After
	public void destory() {
		jsonArray = null;
		jsonObject = null;
		bean = null;
		System.gc();
	}

	public final void print(String string) {
		System.out.println(string);
	}

	// Java对象转JSON
	@Test
	public void testObject2JSON() {
		// Java Bean对象转JSON
		print(JSONObject.fromObject(bean).toString());// Java Bean >>> JSON Object
		print(JSONArray.fromObject(bean).toString());// Java Bean >>> JSON Array,array会在最外层套上[]
		print(JSONSerializer.toJSON(bean).toString());// Java Bean >>> JSON  Object

		// 转换Java List集合到JSON
		// 如果你是转换List集合,一定得用JSONArray或是JSONSrializer提供的序列化方法。如果你用JSONObject.fromObject方法转换List会出现异常,
		// 通常使用JSONSrializer这个JSON序列化的方法,它会自动识别你传递的对象的类型,然后转换成相应的JSON字符串。
		print("***********************Java List >>> JSON*******************************");
		List<User> list = new ArrayList<User>();
		list.add(bean);
		bean.setName("jack");
		list.add(bean);
		print(JSONArray.fromObject(list).toString());
		print(JSONSerializer.toJSON(list).toString());

		// Map对象转JSON
		// Map集合有JavaBean、String、Boolean、Integer、以及Array和js的function函数的字符串。
		print("*************************Java Map >>> JSON*******************************");
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("A", bean);
		bean.setName("jack");
		map.put("B", bean);
		map.put("name", "json");
		map.put("bool", Boolean.TRUE);
		map.put("int", new Integer(1));
		map.put("arr", new String[] { "a", "b" });
		map.put("func", "function(i){ return this.arr[i]; }");
		print(JSONObject.fromObject(map).toString());// Java Map >>> JSON Object
		print(JSONArray.fromObject(map).toString());// Java Map >>> JSON Array
		print(JSONSerializer.toJSON(map).toString());// Java Map >>> JSON Object

		// 将更多类型转换成JSON
		// 这里还有一个JSONFunction的对象,可以转换JavaScript的function。可以获取方法参数和方法体。同时,还可以用JSONObject、JSONArray构建Java对象,完成Java对象到JSON字符串的转换。
		String[] sa = { "a", "b", "c" };
		print("==============Java StringArray >>> JSON Array ==================");
		print(JSONArray.fromObject(sa).toString());
		print(JSONSerializer.toJSON(sa).toString());
		Object[] o = { 1, "a", true, 'A', sa };
		print("==============Java Object Array >>> JSON Array ==================");
		print(JSONArray.fromObject(o).toString());
		print(JSONSerializer.toJSON(o).toString());
		print("==============Java String >>> JSON ==================");
		print(JSONArray.fromObject("['json','is','easy']").toString());
		print(JSONObject.fromObject("{'json':'is easy'}").toString());
		print(JSONSerializer.toJSON("['json','is','easy']").toString());
		print("==============Java JSONObject >>> JSON ==================");
		jsonObject = new JSONObject().element("string", "JSON").element("integer", "1").element("double", "2.0")
				.element("boolean", "true");
		print(JSONSerializer.toJSON(jsonObject).toString());

		print("==============Java JSONArray >>> JSON ==================");
		jsonArray = new JSONArray().element("JSON").element("1").element("2.0").element("true");
		print(JSONSerializer.toJSON(jsonArray).toString());

		print("==============Java JSONArray JsonConfig#setArrayMode >>> JSON ==================");
		List<String> input = new ArrayList<>();
		input.add("JSON");
		input.add("1");
		input.add("2.0");
		input.add("true");
		JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON(input);
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setArrayMode(JsonConfig.MODE_OBJECT_ARRAY);
		Object[] output = (Object[]) JSONSerializer.toJava(jsonArray, jsonConfig);
		System.out.println(output[0]);

		print("==============Java JSONFunction >>> JSON ==================");
		String str = "{'func': function( param ){ doSomethingWithParam(param); }}";
		JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(str);
		JSONFunction func = (JSONFunction) jsonObject.get("func");
		print(func.getParams()[0]);
		print(func.getText());

	}

	// 注意的是使用了JsonConfig这个对象,这个对象可以在序列化的时候对JavaObject的数据进行处理、过滤等
	// 上面的jsonConfig的registerJsonValueProcessor方法可以完成对象值的处理和修改,比如处理生日为null时,给一个特定的值。
	// 同样setJsonPropertyFilter和setJavaPropertyFilter都是完成对转换后的值的处理。
	@Test
	public void test2JSONJsonConfig() {
		print("========================JsonConfig========================");
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.registerJsonValueProcessor(Department.class, new JsonValueProcessor() {
			public Object processArrayValue(Object value, JsonConfig jsonConfig) {
				if (value == null) {
					return new Date();
				}
				return value;
			}

			public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
				print("key:" + key);
				return value + "##修改过的日期";
			}

		});
		jsonObject = JSONObject.fromObject(bean, jsonConfig);

		print(jsonObject.toString());
		User student = (User) JSONObject.toBean(jsonObject, User.class);
		print(jsonObject.getString("birthday"));
		print(student.toString());

		print("#####################JsonPropertyFilter############################");
		jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
			public boolean apply(Object source, String name, Object value) {
				print(source + "%%%" + name + "--" + value);
				// 忽略birthday属性
				if (value != null && Department.class.isAssignableFrom(value.getClass())) {
					return true;
				}
				return false;
			}
		});
		print(JSONObject.fromObject(bean, jsonConfig).toString());
		print("#################JavaPropertyFilter##################");
		jsonConfig.setRootClass(User.class);
		jsonConfig.setJavaPropertyFilter(new PropertyFilter() {
			public boolean apply(Object source, String name, Object value) {
				print(name + "@" + value + "#" + source);
				if ("id".equals(name) || "email".equals(name)) {
					value = name + "@@";
					return true;
				}
				return false;
			}
		});
		// jsonObject = JSONObject.fromObject(bean, jsonConfig);
		// student = (Student) JSONObject.toBean(jsonObject, Student.class);
		// print(student.toString());
		student = (User) JSONObject.toBean(jsonObject, jsonConfig);
		print("Student:" + student.toString());
	}

	// Json字符串转成Java对象
	@SuppressWarnings({ "unchecked", "deprecation" })
	@Test
	public void testJSON2Object() {
		try {
			// Json转Bean
			String objectJson = "{'age':20,'birthday':{'date':28,'day':3,'hours':18,'minutes':40,'month':10,'seconds':1,'time':1543401601583,'timezoneOffset':-480,'year':118},"
					+ "'id':1,'name':'Test','roles':[{'id':1,'name':'角色1'},{'id':2,'name':'角色2'}],'sex':'1'}";
			print("==============JSON Arry String >>> Java Array ==================");
			jsonObject = JSONObject.fromObject(objectJson);
			User user = (User) JSONObject.toBean(jsonObject, User.class);
			System.out.println(user);
			String arrayJson = "[" + objectJson + "]";
			jsonArray = JSONArray.fromObject(arrayJson);
			print(JSONArray.fromObject(arrayJson).join(""));
			User[] userArray = (User[]) JSONArray.toArray(jsonArray, User.class);
			System.out.println(userArray[0]);
			print("*************************Json转List*******************************");
			// Json转List
			List<User> list = new ArrayList<User>();
			list.add(bean);
			bean.setName("jack");
			list.add(bean);
			arrayJson = JSONArray.fromObject(list).toString();
			jsonArray = JSONArray.fromObject(arrayJson);
			List<User> listBean = JSONArray.toList(jsonArray, User.class);
			System.out.println(listBean.size());
			System.out.println(listBean.get(0).getName());
			print("************************Json转Map********************************");
			// Json转Map
			Map<String, User> maps = new HashMap<>();
			maps.put("user1", user);
			maps.put("user2", user);
			String mapJson = JSONObject.fromObject(maps).toString();
			print(mapJson);
			jsonObject = JSONObject.fromObject(mapJson);

			Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();// JSON字符串不能直接转化为map对象,要想取得map中的键对应的值需要别的方式,
			clazzMap.put("user1", User.class);
			clazzMap.put("user2", User.class);
			Map<String, User> jsonToMap = (Map<String, User>) JSONObject.toBean(jsonObject, Map.class, clazzMap);
			System.out.println(jsonToMap.get("user2").getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// Java对象转XML
	// 主要运用的是XMLSerializer的write方法,这个方法可以完成java对象到xml的转换,不过你很容易就可以看到这个xml序列化对象,
	// 需要先将java对象转成json对象,然后再将json转换吃xml文档。
	@Test
	public void testObject2XML() {
		XMLSerializer xmlSerializer = new XMLSerializer();
		xmlSerializer.setTypeHintsEnabled(false);
		xmlSerializer.setRootName("root");
		print("==============Java Bean >>> XML ==================");
		// xmlSerializer.setElementName("bean");
		print(xmlSerializer.write(JSONObject.fromObject(bean)));
		String[] sa = { "a", "b", "c" };
		print("==============Java String Array >>> XML ==================");
		print(xmlSerializer.write(JSONArray.fromObject(sa)));
		print(xmlSerializer.write(JSONSerializer.toJSON(sa)));
		Object[] o = { 1, "a", true, 'A', sa };
		print("==============Java Object Array >>> JSON Array ==================");
		print(xmlSerializer.write(JSONArray.fromObject(o)));
		print(xmlSerializer.write(JSONSerializer.toJSON(o)));
		print("==============Java String >>> JSON ==================");
		print(xmlSerializer.write(JSONArray.fromObject("['json','is','easy']")).toString());
		print(xmlSerializer.write(JSONObject.fromObject("{'json':'is easy'}")).toString());
		print(xmlSerializer.write(JSONSerializer.toJSON("['json','is','easy']")).toString());
	}

	// XML转Java对象
	@Test
	public void testXML2Object() {
		XMLSerializer xmlSerializer = new XMLSerializer();
		print("============== XML >>>> Java String Array ==================");
		String[] sa = { "a", "b", "c" };
		jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject(sa)));
		print(jsonArray.toString());
		String[] s = (String[]) JSONArray.toArray(jsonArray, String.class);
		print(s[0].toString());

		print("==============Java Object Array >>> JSON Array ==================");
		Object[] o = { 1, "a", true, 'A', sa };
		jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject(o)));
		System.out.println(jsonArray.getInt(0));
		System.out.println(jsonArray.get(1));
		System.out.println(jsonArray.getBoolean(2));
		jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONSerializer.toJSON(o)));
		System.out.println(jsonArray.get(4));

		print("==============Java String >>> JSON ==================");
		jsonArray = (JSONArray) xmlSerializer
				.read(xmlSerializer.write(JSONArray.fromObject("['json','is','easy']")).toString());
		s = (String[]) JSONArray.toArray(jsonArray, String.class);
		print(s[0].toString());
		jsonObject = (JSONObject) xmlSerializer
				.read(xmlSerializer.write(JSONObject.fromObject("{'json':'is easy'}")).toString());
		Object obj = JSONObject.toBean(jsonObject);
		System.out.println(obj);
		jsonArray = (JSONArray) xmlSerializer
				.read(xmlSerializer.write(JSONSerializer.toJSON("['json','is','easy']")).toString());
		s = (String[]) JSONArray.toArray(jsonArray, String.class);
		print(s[1].toString());
	}
}
 

 

2、Gson(Google

 

package com.its.test.util.json;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.its.test.util.json.entity.Role;
import com.its.test.util.json.entity.User;

public class GsonTest {
	private User bean = null;

	@Before
	public void init() {
		bean = new User();
		bean.setId(1);
		bean.setName("Test");
		bean.setAge(20);
		bean.setSex("1");
		bean.setBirthday(new Date());
		Role role = new Role();
		role.setId(1);
		role.setName("角色1");
		Role role2 = new Role();
		role2.setId(2);
		role2.setName("角色2");
		List<Role> roles = new ArrayList<Role>();
		roles.add(role);
		roles.add(role2);
		bean.setRoles(roles);
	}

	public final void print(String string) {
		System.out.println(string);
	}

	@Test
	public void testObject2JSON() {

		// 1:Gson gson=newGson();
		// 2:通过GsonBuilder 可以配置多种选项
		// Gson gson = new GsonBuilder()
		// .setLenient()// json宽松
		// .enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
		// .serializeNulls() //智能null
		// .setPrettyPrinting()// 调教格式
		// .disableHtmlEscaping() //默认是GSON把HTML 转义的
		Gson gson = new Gson();
		print(gson.toJson(bean));
		// // 转换Java List集合到JSON
		print("***********************Java List >>> JSON*******************************");
		List<User> list = new ArrayList<User>();
		list.add(bean);
		bean.setName("jack");
		list.add(bean);
		print(gson.toJson(list));
		// Map对象转JSON
		print("*************************Java Map >>> JSON*******************************");
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("A", bean);
		bean.setName("jack");
		map.put("B", bean);
		map.put("name", "json");
		map.put("bool", Boolean.TRUE);
		map.put("int", new Integer(1));
		map.put("arr", new String[] { "a", "b" });
		map.put("func", "function(i){ return this.arr[i]; }");
		print(gson.toJson(map));
	}

	// Json字符串转成Java对象
	@Test
	public void testJSON2Object() {
		Gson gson = new Gson();
		// Json转Bean
		 String objectJson =
		 "{\"id\":1,\"name\":\"Test\",\"age\":20,\"sex\":\"1\",\"birthday\":Nov 29, 2018 10:27:05 AM,\"roles\":[{\"id\":1,\"name\":\"角色1\"},{\"id\":2,\"name\":\"角色2\"}]}";
//		String objectJson = "{\"id\":1,\"name\":\"Test\",\"age\":20,\"sexNo\":\"1\",\"birthday\":1543406407033,\"roles\":[{\"id\":1,\"name\":\"角色1\"},{\"id\":2,\"name\":\"角色2\"}]}";
		User user = gson.fromJson(gson.toJson(bean), User.class);
		print(user.getName());
		// Json转List
		List<User> list = new ArrayList<User>();
		list.add(bean);
		bean.setName("jack");
		list.add(bean);
		Type type = new TypeToken<ArrayList<User>>() {}.getType();
		List<User> userList = gson.fromJson(gson.toJson(list), type);
		print(userList.get(0).getName());
		print("************************Json转Map********************************");
		// Json转Map
		Map<String, User> maps = new HashMap<>();
		maps.put("user1", user);
		maps.put("user2", user);
		Map<String, User> userMaps = gson.fromJson(gson.toJson(maps),new TypeToken<Map<String, User>>() {}.getType());
		print(userMaps.get("user2").getName());
	}

}
 
3、FastJson(阿里巴巴)

 

 

package com.its.test.util.json;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.its.test.util.json.entity.Role;
import com.its.test.util.json.entity.User;

public class FastjsonTest {
	private User bean = null;

	@Before
	public void init() {
		bean = new User();
		bean.setId(1);
		bean.setName("Test");
		bean.setAge(20);
		bean.setSex("1");
		bean.setBirthday(new Date());
		Role role = new Role();
		role.setId(1);
		role.setName("角色1");
		Role role2 = new Role();
		role2.setId(2);
		role2.setName("角色2");
		List<Role> roles = new ArrayList<Role>();
		roles.add(role);
		roles.add(role2);
		bean.setRoles(roles);
	}


	public final void print(String string) {
		System.out.println(string);
	}

	@Test
	public void testObject2JSON() {
		print(JSONObject.toJSON(bean).toString());
		// // 转换Java List集合到JSON
		print("***********************Java List >>> JSON*******************************");
		List<User> list = new ArrayList<User>();
		list.add(bean);
		bean.setName("jack");
		list.add(bean);
		print(JSONObject.toJSON(list).toString());
		// Map对象转JSON
		print("*************************Java Map >>> JSON*******************************");
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("A", bean);
		bean.setName("jack");
		map.put("B", bean);
		map.put("name", "json");
		map.put("bool", Boolean.TRUE);
		map.put("int", new Integer(1));
		map.put("arr", new String[] { "a", "b" });
		map.put("func", "function(i){ return this.arr[i]; }");
		print(JSONObject.toJSONString(map));
	}

	// Json字符串转成Java对象
	@Test
	public void testJSON2Object() {
		// Json转Bean
		// String objectJson =
		// "{\"id\":1,\"name\":\"Test\",\"age\":20,\"sex\":\"1\",\"birthday\":1543406407033,\"roles\":[{\"id\":1,\"name\":\"角色1\"},{\"id\":2,\"name\":\"角色2\"}]}";
		String objectJson = "{\"id\":1,\"name\":\"Test\",\"age\":20,\"sexNo\":\"1\",\"birthday\":1543406407033,\"roles\":[{\"id\":1,\"name\":\"角色1\"},{\"id\":2,\"name\":\"角色2\"}]}";
		User user = JSONObject.parseObject(objectJson, User.class);
		print(user.getName());
		user = JSONObject.parseObject(JSONObject.toJSONString(bean), User.class);
		print(user.getRoles().get(0).getName());
		// Json转List
		List<User> list = new ArrayList<User>();
		list.add(bean);
		bean.setName("jack");
		list.add(bean);
		List<User> userList = JSONObject.parseObject(JSONObject.toJSONString(list), new TypeReference<List<User>>() {
		});
		print(userList.get(0).getName());
		print("************************Json转Map********************************");
		// Json转Map
		Map<String, User> maps = new HashMap<>();
		maps.put("user1", user);
		maps.put("user2", user);
		Map<String, User> userMaps = JSONObject.parseObject(JSONObject.toJSONString(maps),
				new TypeReference<Map<String, User>>() {});
		print(userMaps.get("user2").getName());
	}

}
 

 

4、Jackson

package com.its.test.util.json;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.its.test.util.json.entity.Role;
import com.its.test.util.json.entity.User;

public class JacksonTest {
	private JsonGenerator jsonGenerator = null;
	private ObjectMapper objectMapper = null;
	private User bean = null;

	@SuppressWarnings("deprecation")
	@Before
	public void init() {
		bean = new User();
		bean.setId(1);
		bean.setName("Test");
		bean.setAge(20);
		bean.setSex("1");
		bean.setBirthday(new Date());
		Role role = new Role();
		role.setId(1);
		role.setName("角色1");
		Role role2 = new Role();
		role2.setId(2);
		role2.setName("角色2");
		List<Role> roles = new ArrayList<Role>();
		roles.add(role);
		roles.add(role2);
		bean.setRoles(roles);
		objectMapper = new ObjectMapper();
		try {
			jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@After
	public void destory() {
		try {
			if (jsonGenerator != null) {
				jsonGenerator.flush();
			}
			if (!jsonGenerator.isClosed()) {
				jsonGenerator.close();
			}
			jsonGenerator = null;
			objectMapper = null;
			bean = null;
			System.gc();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public final void print(String string) {
		System.out.println(string);
	}

	@Test
	public void testObject2JSON() {
		try {
			print("***********************jsonGenerator*******************************");
			jsonGenerator.writeObject(bean);
			print("***********************ObjectMapper*******************************");
			print(objectMapper.writeValueAsString(bean));
			// 转换Java List集合到JSON
			print("***********************Java List >>> JSON*******************************");
			List<User> list = new ArrayList<User>();
			list.add(bean);
			bean.setName("jack");
			list.add(bean);
			print(objectMapper.writeValueAsString(list));
			// Map对象转JSON
			print("*************************Java Map >>> JSON*******************************");
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("A", bean);
			bean.setName("jack");
			map.put("B", bean);
			map.put("name", "json");
			map.put("bool", Boolean.TRUE);
			map.put("int", new Integer(1));
			map.put("arr", new String[] { "a", "b" });
			map.put("func", "function(i){ return this.arr[i]; }");
			print(objectMapper.writeValueAsString(map));
			
			print("*************************其他*******************************");
			String[] arr = { "a", "b", "c" };
			System.out.println("jsonGenerator");
			String str = "hello world jackson!";
			// byte
			jsonGenerator.writeBinary(str.getBytes());
			// boolean
			jsonGenerator.writeBoolean(true);
			// null
			jsonGenerator.writeNull();
			// float
			jsonGenerator.writeNumber(2.2f);
			// char
			jsonGenerator.writeRaw("c");
			// String
			jsonGenerator.writeRaw(str, 5, 10);
			// String
			jsonGenerator.writeRawValue(str, 5, 5);
			// String
			jsonGenerator.writeString(str);
			jsonGenerator.writeTree(JsonNodeFactory.instance.pojoNode(str));
			System.out.println();

			// Object
			jsonGenerator.writeStartObject();// {
			jsonGenerator.writeObjectFieldStart("user");// user:{
			jsonGenerator.writeStringField("name", "jackson");// name:jackson
			jsonGenerator.writeBooleanField("sex", true);// sex:true
			jsonGenerator.writeNumberField("age", 22);// age:22
			jsonGenerator.writeEndObject();// }

			jsonGenerator.writeArrayFieldStart("infos");// infos:[
			jsonGenerator.writeNumber(22);// 22
			jsonGenerator.writeString("this is array");// this is array
			jsonGenerator.writeEndArray();// ]

			jsonGenerator.writeEndObject();// }

			// complex Object
			jsonGenerator.writeStartObject();// {
			jsonGenerator.writeObjectField("user", bean);// user:{bean}
			jsonGenerator.writeObjectField("infos", arr);// infos:[array]
			jsonGenerator.writeEndObject();// }
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// Json字符串转成Java对象
	@SuppressWarnings("unchecked")
	@Test
	public void testJSON2Object() {
		try {
			// Json转Bean
			String objectJson = "{\"id\":1,\"name\":\"Test\",\"age\":20,\"sex\":\"1\",\"birthday\":1543406407033,\"roles\":[{\"id\":1,\"name\":\"角色1\"},{\"id\":2,\"name\":\"角色2\"}]}";
			User user = objectMapper.readValue(objectJson, User.class);
			print(user.getName());
			user = objectMapper.readValue(objectMapper.writeValueAsString(bean), User.class);
			print(user.getRoles().get(0).getName());
			// Json转List
			List<User> list = new ArrayList<User>();
			list.add(bean);
			bean.setName("jack");
			list.add(bean);
			List<LinkedHashMap<String, Object>> users = objectMapper.readValue(objectMapper.writeValueAsString(list), List.class);
			for (int i = 0; i < list.size(); i++) {
	            Map<String, Object> map = users.get(i);
	            Set<String> set = map.keySet();
	            for (Iterator<String> it = set.iterator();it.hasNext();) {
	                String key = it.next();
	                System.out.println(key + ":" + map.get(key));
	            }
	        }
			print("************************Json转Map********************************");
			// Json转Map
			Map<String, User> maps = new HashMap<>();
			maps.put("user1", user);
			maps.put("user2", user);
			Map<String, Map<String, Object>> userMaps = objectMapper.readValue(objectMapper.writeValueAsString(maps), Map.class);
			print(userMaps.get("user1").toString());
//			jsonObject = JSONObject.fromObject(mapJson);
//
//			Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();// JSON字符串不能直接转化为map对象,要想取得map中的键对应的值需要别的方式,
//			clazzMap.put("user1", User.class);
//			clazzMap.put("user2", User.class);
//			Map<String, User> jsonToMap = (Map<String, User>) JSONObject.toBean(jsonObject, Map.class, clazzMap);
//			System.out.println(jsonToMap.get("user2").getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

分享到:
评论

相关推荐

    json串解析

    3. JSON解析基本步骤: - 读取JSON字符串:通常从网络请求、文件或数据库中获取JSON数据。 - 创建映射对象:定义与JSON结构匹配的Java类,包含对应的属性。 - 解析JSON:使用Jackson或Gson的API将JSON字符串转化...

    JsonRpc小实例

    Ajax,全称Asynchronous JavaScript and XML,虽然名字中包含XML,但实际上它并不仅限于XML,而是广泛使用JSON作为数据交换格式,因为JSON解析和生成的速度更快,且更易于阅读和编写。 在"JsonRpc小实例"中,我们...

    巧用eval解析json对象

    本篇将聚焦于如何巧妙地使用`eval`函数来解析JSON对象,虽然在实际开发中,由于安全考虑我们通常会避免使用`eval`,但理解其工作原理对于学习JavaScript和JSON解析至关重要。 首先,JSON对象本质上是符合JSON语法的...

    Scala解析Json字符串的实例详解

     Json解析工具使用的 json-smart,曾经对比过Java的fastjson、gson。Scala的json4s、lift-json。其中 json-smart 解析速度是最快的。 &lt;groupId&gt;net.minidev&lt;/groupId&gt; &lt;artifactId&gt;json-smart &lt;version&gt;2.3 ...

    JSONModel MVC demo

    只需定义一个Objective-C类,该类继承自JSONModel,并标注属性类型,然后就可以直接将JSON字符串转化为这个类的实例。这样,你就可以在Model层直接使用这些对象,无需手动解析JSON。 MJExtension是另一个常用的...

    Revit模型转JSON数据测试数据(JSON数据)

    JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在IT和BIM领域中,JSON因其简洁和高效,常被用于传输和存储数据。 在Revit模型转JSON的过程中,...

    TCP收发json. 客户端和服务端

    JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,因此在Web服务中被广泛应用。 首先,让我们详细解释TCP协议。TCP是一种面向连接的、可靠的传输协议,它在数据传输前会建立连接,并...

    IOS JSON DEMO

    本文将深入探讨“iOS JSON Demo”中涉及的JSON解析技术,包括三种主流的第三方类库以及iOS系统自带的解析方法。 首先,我们要了解iOS内置的JSON解析方法。苹果在Foundation框架中提供了`NSJSONSerialization`类,它...

    转换为json数据以及完整的json包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但被广泛应用于各种编程语言中,包括Java。在本主题中,我们将深入探讨...

    json格式 json格式大全

    4. **解码难度**:XML的解析方式主要有两种:文档模型解析和节点遍历。而JSON在JavaScript环境下解析更为便捷,尤其是当事先知道JSON结构时。 #### 实例比较 假设我们需要表示中国的部分省市数据: **XML 示例**...

    JSON.zip_JSON

    2. JSON与XML的对比:讨论JSON相对于XML的优势,如更小的体积、更快的解析速度以及更直观的结构。 3. JSON的解析与生成:解释如何在各种编程语言中解析JSON字符串为数据结构,以及如何将数据结构转换为JSON字符串。 ...

    java转json测试项目(附带json jar包)

    例如,你可以使用`parseObject()`方法将JSON字符串解析为Java对象,或者使用`toJSONString()`方法将Java对象转换为JSON字符串。 另一方面,json-lib是一个广泛使用的JSON库,其中`net.sf.json.JSONObject`类同样...

    Delphi与JSON数据交换的例子.rar

    1. **JSON解析与生成**:学习如何使用Delphi的内置JSON类,如TJSONObject和TJSONArray,创建和解析JSON对象。 2. **网络通信**:了解如何在Delphi中实现HTTP请求或WebSocket连接,以发送和接收JSON数据。 3. **...

    json基本介绍及优缺点.zip

    4. **JSON与XML的对比**:JSON比XML更简洁,解析速度更快,但XML提供了更丰富的结构和元数据支持。在Web服务和浏览器交互中,JSON通常比XML更为常见。 5. **优点**:轻量级,易于阅读和编写,同时也易于机器解析和...

    swift-macapp根据json字符串创建模型类自动判断类型

    这个过程涉及到JSON解析、类型映射以及自动判断类型等功能。`swift-macapp根据json字符串创建模型类自动判断类型`是一个针对这个问题的解决方案,它帮助开发者更高效地实现JSON到Swift模型类的转换。 首先,Swift...

    JSON中文教程

    JSON采用了一种类似于XML的文本形式来表示数据,但相较于XML而言,JSON具有更加紧凑、快速且易于解析的特点。 ##### 1.1 什么是JSON? JSON是一种用来存储和交换文本信息的标准格式。其设计初衷是为了让数据更加...

    Echarts 吉林省 市地图json

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在ECharts中,地图JSON文件通常包含了各个地区的地理坐标信息,这些信息用于在地图上正确绘制出各个...

    JSON的jar包

    4. **JSON解析**:可以使用`JSONObject.getString()`, `JSONObject.getInt()`, `JSONObject.getJSONArray()`等方法获取JSON对象中的值。对于JSON数组,可以遍历`JSONArray`并调用`JSONObject`的方法获取数据。 5. *...

Global site tag (gtag.js) - Google Analytics