JSON字符串和Java对象互转

在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看下JSON的格式。



JSON可以有两种格式

  • 一种是对象格式的
  • 另一种是数组对象
  1. JSON的对象格式的字符串: {"stuName":"张三","stuAge":"","age":"广州天河区"}
  2. 数据对象格式:[{"name":"李四","stuAge":30,"address":"广州越秀区"}]

从上面的两种格式可以看出对象格式和数组对象格式唯一的不同则是在对象格式的基础上加上了[],再来看具体的结构,可以看出都是以键值对的形式出现的,中间以英文状态下的逗号(,)分隔。
在前端和后端进行数据传输的时候这种格式也是很受欢迎的,后端返回json格式的字符串,前台使用js中的JSON.parse()方法把JSON字符串解析为json对象,然后进行遍历,供前端使用。

 



使用Json需要的Jar包:

Jar包的版本号可以忽略,目前使用过多种版本均没发现什么问题

commons-beanutils-1.9.1.jar

commons-collections-3.2.2.jar

commons-lang-2.6.jar

commons-logging-1.2.jar

ezmorph-1.0.6.jar

json-lib-2.4-jdk15.jar



编码/测试



Java普通对象和Json字符串互转



Java对象 - > Json字符串

创建一个实体类用于测试

package com.org.demo;

public class Students {

	private String stuName;
	private String stuAge;
	private String address;

	public String getStuName() {
		return stuName;
	}

	public void setStuName(String stuName) {
		this.stuName = stuName;
	}

	public String getStuAge() {
		return stuAge;
	}

	public void setStuAge(String stuAge) {
		this.stuAge = stuAge;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String toString() {
		return "Student [stuName=" + stuName + ", stuAge=" + stuAge + ", address=" + address + "]";
	}
}

编写转换方法

// Java对象转JSON字符串
public static void javaToJsonStr() {
	Students students = new Students();
	students.setStuName("张三");
	students.setStuAge("28");
	students.setAddress("广州天河区");
	// 1、使用JSONObject
	JSONObject strJson = JSONObject.fromObject(students);
	// 2、使用JSONArray
	JSONArray strArray = JSONArray.fromObject(students);

	System.out.println("Java对象转JSON字符串");
	System.out.println("JSON:" + strJson.toString());
	System.out.println("Array:" + strArray.toString());
}

运行结果

Java对象转JSON字符串
JSON:{"address":"广州天河区","stuName":"张三","stuAge":"28"}
Array:[{"address":"广州天河区","stuName":"张三","stuAge":"28"}]

 



Json字符串 -> Java对象

public static void jsonStrToJava() {
	// 定义两种不同格式的字符串
	String objectStr = "{\"stuName\":\"张三\",\"stuAge\":\"28\",\"address\":\"广州天河区\"}";
	String arrayStr = "[{\"stuName\":\"张三\",\"stuAge\":\"28\",\"address\":\"广州天河区\"}]";

	// 1、使用JSONObject
	JSONObject jsonObject = JSONObject.fromObject(objectStr);
	Students students = (Students) JSONObject.toBean(jsonObject, Students.class);

	// 2、使用JSONArray
	JSONArray jsonArray = JSONArray.fromObject(arrayStr);
	// 获得jsonArray的第一个元素
	Object o = jsonArray.get(0);
	JSONObject jsonObject2 = JSONObject.fromObject(o);
	Students students2 = (Students) JSONObject.toBean(jsonObject2, Students.class);
	
	System.out.println("JSON字符串转Java对象");
	System.out.println("students:" + students);
	System.out.println("students2:" + students2);
}

运行结果

JSON字符串转Java对象
students:Student [stuName=张三, stuAge=28, address=广州天河区]
students2:Student [stuName=张三, stuAge=28, address=广州天河区]

 



List和Json字符串的互转



list -> Json字符串

//List转换为Json字符串
public static void listToJson() {
	Students stu = new Students();
	stu.setStuName("张三");
	stu.setStuAge("28");
	stu.setAddress("广州天河区");
	List<Students> lists = new ArrayList<Students>();
	lists.add(stu);

	JSONArray listArray = JSONArray.fromObject(lists);
	System.out.println("listArray:" + listArray.toString());
}

运行结果

listArray:[{"address":"广州天河区","stuName":"张三","stuAge":"28"}]



Json字符串 -> List

//Json字符串转换为List对象
public static void jsonToList() {
	String arrayStr = "[{\"stuName\":\"张三\",\"stuAge\":\"28\",\"address\":\"广州天河区\"}]";
	// 转化为list
	List<Students> list = (List<Students>) JSONArray.toList(JSONArray.fromObject(arrayStr), Students.class);
	for (Students svo : list) {
		System.out.println(svo);
	}
	// 转化为数组
	Students[] stuArray = (Students[]) JSONArray.toArray(JSONArray.fromObject(arrayStr), Students.class);
	for (Students student : stuArray) {
		System.out.println(student);
	}
}

运行结果

Student [stuName=张三, stuAge=28, address=广州天河区]
Student [stuName=张三, stuAge=28, address=广州天河区]

 



Map和Json字符串互转



Map -> Json字符串

//Map转Json字符串
public static void mapToJson() {
	Students stu = new Students();
	stu.setStuName("张三");
	stu.setStuAge("28");
	stu.setAddress("广州天河区");
	Map<String, Students> map = new HashMap<String, Students>();
	map.put("first", stu);

	// 1、JSONObject
	JSONObject mapObject = JSONObject.fromObject(map);
	System.out.println("mapObject" + mapObject.toString());

	// 2、JSONArray
	JSONArray mapArray = JSONArray.fromObject(map);
	System.out.println("mapArray:" + mapArray.toString());
}

运行结果

mapObject{"first":{"address":"广州天河区","stuName":"张三","stuAge":"28"}}
mapArray:[{"first":{"address":"广州天河区","stuName":"张三","stuAge":"28"}}]

 



Json字符串 -> Map

JSON字符串不能直接转化为map对象,要想取得map中的键对应的值需要别的方式

//Json字符串转Map
public static void jsonToMap() {
	String strObject = "{\"first\":{\"address\":\"广州天河区\",\"stuAge\":\"28\",\"stuName\":\"张三\"}}";
	// JSONObject
	JSONObject jsonObject = JSONObject.fromObject(strObject);
	Map<String, Object> map = new HashMap<String, Object>();
	map.put("first", Students.class);

	// 使用了toBean方法,需要三个参数
	MyBean my = (MyBean) JSONObject.toBean(jsonObject, MyBean.class, map);
	System.out.println(my.getFirst());

}

运行结果

Student [stuName=张三, stuAge=28, address=广州天河区]

 

MyBean对象代码

package com.org.demo;

public class MyBean {
	private Students first;

	public Students getFirst() {
		return first;
	}

	public void setFirst(Students first) {
		this.first = first;
	}
}

使用toBean()方法是传入了三个参数,第一个是JSONObject对象,第二个是MyBean.class,第三个是一个Map对象。通过MyBean可以知道此类中要有一个first的属性,且其类型为Students,要和map中的键和值类型对应,即,first对应键 first类型对应值的类型。
关于复杂的JSON串转化为java对象的内容,在下篇中会继续说明。
本篇,主要说明了java中的bean、list、map和JSON的互转。