生成和解析JSON
1、什么是JSON,JSON的作用是什么,如何编写JSON?
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
一个java对象转换成json对象以后是什么样子?
package com.click369.test1;
public class Person {
private int perid;
private String pername;
private int perage;
private String peraddress;
}
创建一个person类的对象:
public class Test1{
Person person1=new Person();
person1.setPerid(1001);
person1.setPername("zhangsan");
person1.setPerage(23);
person1.setPeraddress("西安");
}
将person1这个java对象转换成json对象对应的字符串数据: {"perid":1001,"pername":"zhangsan","perage":23,"peraddress":"西安"}
上面是将一个java对象写成json的样子。
假设现在有一组对象需要写成json的样子,那应该怎么写?
public class Test2{
Person person1=new Person();
person1.setPerid(1001);
person1.setPername("zhangsan");
person1.setPerage(23);
person1.setPeraddress("西安");
Person person2=new Person();
person2.setPerid(1002);
person2.setPername("lisi");
person2.setPerage(24);
person2.setPeraddress("北京");
Person person3=new Person();
person3.setPerid(1003);
person3.setPername("wangwu");
person3.setPerage(25);
person3.setPeraddress("上海");
//创建一个保存person对象的集合
List<Person> personlist=new ArrayList<Person>();
//将上面创建的3个person对象保存到集合中
personlist.add(person1);
personlist.add(person2);
personlist.add(person3);
}
将保存java对象的集合写成json的样子。
[
{"perid":1001,"pername":"zhangsan","perage":23,"peraddress":"西安"},
{"perid":1002,"pername":"lisi","perage":24,"peraddress":"北京"},
{"perid":1003,"pername":"wangwu","perage":25,"peraddress":"上海"}
]
注意:
- 用一组“{}”包围键/值对组合,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值,多个键/值对组合中间用“,”分隔,这就表示一个json对象。
- 用一组“[]”包围值/json对象这就表示一个json数组。json数组是用来保存java数组数据/集合数据。
- json对象中数字值和布尔值是不需要双引号。
通常情况下我们所遇到的json数据都是json对象中包含json数组,json数组中又包含json对象的复杂形式。
例如:
package com.click369.test2;
/**
* 保存地址信息的java类
* @author Administrator
*
*/
public class PersonAddress {
private String type; //地址类型【家庭/工作】
private String info; //地址信息
}
package com.click369.test2;
public class Person {
private int perid;
private String pername;
private int perage;
//保存地址信息的数组
private PersonAddress peraddress[];
}
创建3个person类的对象:
Person person1=new Person();
person1.setPerid(1001);
person1.setPername("zhangsan");
person1.setPerage(23);
//创建保存地址信息的数组
PersonAddress peraddress[]=new PersonAddress[2];
//创建两个地址的对象
PersonAddress address1=new PersonAddress();
address1.setType("home");
address1.setInfo("西安");
PersonAddress address2=new PersonAddress();
address2.setType("work");
address2.setInfo("北京");
//将创建好的地址对象装入数组
peraddress[0]=address1;
peraddress[1]=address2;
person1.setPeraddress(peraddress);
Person person2=new Person();
person2.setPerid(1002);
person2.setPername("lisi");
person2.setPerage(24);
//创建保存地址信息的数组
PersonAddress peraddress2[]=new PersonAddress[2];
//创建两个地址的对象
PersonAddress address21=new PersonAddress();
address21.setType("home");
address21.setInfo("上海");
PersonAddress address22=new PersonAddress();
address22.setType("work");
address22.setInfo("重庆");
//将创建好的地址对象装入数组
peraddress2[0]=address21;
peraddress2[1]=address22;
person2.setPeraddress(peraddress2);
Person person3=new Person();
person3.setPerid(1003);
person3.setPername("wangwu");
person3.setPerage(25);
//创建保存地址信息的数组
PersonAddress peraddress3[]=new PersonAddress[2];
//创建两个地址的对象
PersonAddress address31=new PersonAddress();
address31.setType("home");
address31.setInfo("广州");
PersonAddress address32=new PersonAddress();
address32.setType("work");
address32.setInfo("西安");
//将创建好的地址对象装入数组
peraddress3[0]=address31;
peraddress3[1]=address32;
person3.setPeraddress(peraddress3);
//创建一个保存person对象的集合
List<Person> personlist=new ArrayList<Person>();
//将创建的person对象存储至集合中
personlist.add(person1);
personlist.add(person2);
personlist.add(person3);
将上面的集合转换成json数据字符串以后是什么样子???
[
{ "perid":1001,
"pername":"zhangsan",
"perage":23,
"peraddress":[
{"type":"home","info":"西安"},
{"type":"work","info":"北京"}
]----json数组
}, -- json对象
{"perid":1002,
"pername":"lisi",
"perage":24,
"peraddress":[
{"type":"home","info":"上海"},
{"type":"work","info":"重庆"}
]
},
{"perid":1003,
"pername":"wangwu",
"perage":25,
"peraddress":[
{"type":"home","info":"广州"},
{"type":"work","info":"西安"}
]
}
]
当我们得到一个极其复杂的json数据后,搞不清楚这个json数据的结构。我们可以利用工具【https://www.json.cn/】得到明晰的json数据的结构。
2、JSON数据的生成方式和解析方式
2.1 JSON数据的生成【java对象---json数据】
1.json-simple-1.1.jar第三方的开发包生成json数据
2.gson-2.8.0.jar第三方的开发包生成json数据
3.jackson第三方的开发包生成json数据
“jackson-core-2.9.5.jar”
“jackson-databind-2.9.5.jar”
“jackson-annotations-2.9.5.jar”
package com.wangxing.json.helper;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wangxing.json.bean.Person;
import com.wangxing.json.bean.PersonAddress;
import com.wangxing.util.JSONUtil;
public class JSONHelper {
/**
* 1.json-simple-1.1.jar第三方的开发包生成json数据
*/
public static String createJsonByjsonsimple(List<Person> personlist)throws Exception{
String jsoninfo="";
//创建json数组
JSONArray perlistarray=new JSONArray();
//遍历集合得到person对象
for (Person person : personlist) {
//创建json对象
JSONObject personObject=new JSONObject();
personObject.put("perid", person.getPerid());
personObject.put("pername",person.getPername());
personObject.put("perage",person.getPerage());
//创建保存personaddress地址数据的数组
JSONArray addressarray=new JSONArray();
for(PersonAddress peraddress:person.getPeraddress()){
//创建保存地址的json对象
JSONObject addressObject=new JSONObject();
addressObject.put("type",peraddress.getType());
addressObject.put("info", peraddress.getInfo());
addressarray.add(addressObject);
}
//将地址保存到person对象
personObject.put("address", addressarray);
//将person对象保存到json数组
perlistarray.add(personObject);
}
jsoninfo=perlistarray.toJSONString();
return jsoninfo;
}
/**
* 2.gson-2.8.0.jar第三方的开发包生成json数据
*/
/*
public static String createJsonBygson(List<Person> personlist)throws Exception{
String jsoninfo="";
jsoninfo =new Gson().toJson(personlist);
return jsoninfo;
}
*/
/**
* 3.jackson第三方的开发包生成json数据
*/
public static String createJsonByJackson(List<Person> personlist)throws Exception{
String jsoninfo="";
jsoninfo=new ObjectMapper().writeValueAsString(personlist);
return jsoninfo;
}
}
2.2 JSON数据的解析【json数据---java对象】
1.json-simple-1.1.jar第三方的开发包解析json数据
2.gson-2.8.0.jar第三方的开发包解析json数据
3.jackson第三方的开发包解析json数据
package com.wangxing.util;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.wangxing.json.bean.Person;
public class JSONUtil {
/**
* 1.json-simple-1.1.jar第三方的开发包解析json数据
*/
/*
public static List<Person> parseJsonByjsonsimple(String json)throws Exception{
List<Person> personlist=new ArrayList();
//创建一个json解析器对象
JSONParser jsonpaser=new JSONParser();
//将要解析的json数据转化成数组
JSONArray perlistArray=(JSONArray)jsonpaser.parse(json);
//遍历数组得到person对象
for(int i=0;i<perlistArray.size();i++){
Person person=new Person();
JSONObject jsonobject=(JSONObject)perlistArray.get(i);
long id=(long)jsonobject.get("perid");
int perid=(int)id;
person.setPerid(perid);
String name=(String)jsonobject.get("pername");
person.setPername(name);
long age=(long)jsonobject.get("perage");
int perage=(int)age;
person.setPerage(perage);
//得到json数据中地址的信息
JSONArray addressArray=(JSONArray)jsonobject.get("peraddress");
//定义一个保存地址的数组
PersonAddress peraddressArray[]=new PersonAddress[addressArray.size()];
for(int j=0;j<addressArray.size();j++){
PersonAddress address=new PersonAddress();
JSONObject addressObject=(JSONObject)addressArray.get(j);
String type=(String)addressObject.get("type");
address.setType(type);
String info=(String)addressObject.get("info");
address.setInfo(info);
peraddressArray[j]=address;
}
person.setPeraddress(peraddressArray);
personlist.add(person);
}
return personlist;
}
*/
/**
* 2.gson-2.8.0.jar第三方的开发包解析json数据
*/
public static List<Person> parseJsonByGson(String json)throws Exception {
Gson gson=new Gson();
return gson.fromJson(json, new TypeToken<List<Person>>(){}.getType());
}
/**
* 3.jackson第三方的开发包解析json数据
*/
public static List<Person> parseJsonByjackson(String json)throws Exception {
List<Person> personlist=new ArrayList();
//创建解析器对象
ObjectMapper objectMapper=new ObjectMapper();
JsonNode personArray=objectMapper.readTree(json);
for(int i=0;i<personArray.size();i++){
Person person=new Person();
JsonNode personobj=personArray.get(i);
int perid=personobj.get("perid").asInt();
person.setPerid(perid);
String pername=personobj.get("pername").asText();
person.setPername(pername);
personlist.add(person);
}
return personlist;
}
}
生成和解析json数据的测试方法:
package ocm.wangxing.json.test;
import java.util.ArrayList;
import java.util.List;
import com.wangxing.json.bean.Person;
import com.wangxing.json.bean.PersonAddress;
import com.wangxing.json.helper.JSONHelper;
import com.wangxing.util.JSONUtil;
public class Main {
public static void main(String[] args) throws Exception {
Person per1=new Person();
per1.setPerid(1001);
per1.setPername("张三");
per1.setPerage(23);
PersonAddress add1=new PersonAddress();
add1.setType("家庭");
add1.setInfo("西安");
PersonAddress add2=new PersonAddress();
add2.setType("学校");
add2.setInfo("北京");
PersonAddress addarray[]=new PersonAddress[2];
addarray[0]=add1;
addarray[1]=add2;
per1.setPeraddress(addarray);
Person per2=new Person();
per2.setPerid(1002);
per2.setPername("李四");
per2.setPerage(24);
PersonAddress add3=new PersonAddress();
add3.setType("家庭");
add3.setInfo("广州");
PersonAddress add4=new PersonAddress();
add4.setType("学校");
add4.setInfo("上海");
PersonAddress addarray2[]=new PersonAddress[2];
addarray2[0]=add3;
addarray2[1]=add4;
per2.setPeraddress(addarray2);
List<Person> personlist=new ArrayList();
personlist.add(per1);
personlist.add(per2);
//生成json数据
/**
* 1.测试基于json-simple-1.1.jar第三方的开发包生成json数据
*/
//String s=JSONHelper.createJsonByjsonsimple(personlist);
//System.out.println(s);
/**
* 2.测试基于gson-2.8.0.jar第三方的开发包生成json数据
*/
//String s=JSONHelper.createJsonBygson(personlist);
//System.out.println(s);
/**
* 3.测试基于jackson第三方的开发包生成json数据
*/
//String s=JSONHelper.createJsonByJackson(personlist);
//System.out.println(s);
//解析json数据
//1.基于json-simple-1.1.jar第三方的开发包解析json数据
//List<Person> perlist=
//JSONUtil.parseJsonByjsonsimple(JSONHelper.createJsonByJackson(personlist));
//2.基于gson-2.8.0.jar第三方的开发包解析json数据
//List<Person> perlist=
//JSONUtil.parseJsonByGson(JSONHelper.createJsonByJackson(personlist));
//3.基于jackson第三方的开发包解析json数据
List<Person> perlist=
JSONUtil.parseJsonByjackson(JSONHelper.createJsonByJackson(personlist));
for (Person person : perlist) {
System.out.println(person.getPerid()+" "+person.getPername());
}
}
}