生成和解析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;
	getXXX()/setXXX();
}

//创建一个person类的对象

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的样子,那应该怎么写?

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":"上海"}
]

注意:
1.用一组“{}”包围键/值对组合,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值,多个键/值对组合中间用“,”分隔,这就表示一个json对象。
2.用一组“[]”包围值/json对象这就表示一个json数组。json数组是用来保存java数组数据/集合数据。
3.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":"西安"}
		        ]
	}
]

https://free-api.heweather.com/v5/weather?city=%E8%A5%BF%E5%AE%89&key=d7bd43af19c64994b62fc643e5d75272

当我们得到一个极其复杂的json数据后,搞不清楚这个json数据的结构。我们可以利用工具【https://www.json.cn/】得到明晰的json数据的结构。

2.JSON数据的生成方式和解析方式
2.1 JSON数据的生成【java对象—json数据】
1.json-simple-1.1.jar第三方的开发包生成json数据

/*
	 * 1.json-simple-1.1.jar第三方的开发包生成json数据
	 */

	public static String createJson1(List<Person> personlist) {
	    //创建JSONArray对象
		JSONArray personarray=new JSONArray();
		//遍历集合,创建json对象,装入JSONArray数组
		for(Person person:personlist) {
			//创建保存person对象JSONObejct对象
			JSONObject personObject=new JSONObject();
			personObject.put("perid",person.getPerid());
			personObject.put("pername",person.getPername());
			personObject.put("perage",person.getPerage());
			//创建保存personaddress对象JSONArray数组对象
			JSONArray personAddressArray=new JSONArray();
			for(PersonAddress personAddress:person.getPeraddress()) {
				//创建保存personaddress对象JSONObject对象
				JSONObject addressObject=new JSONObject();
				addressObject.put("type",personAddress.getType());
				addressObject.put("info", personAddress.getInfo());
				personAddressArray.add(addressObject);
				
			}
			personObject.put("peraddress",personAddressArray);
			personarray.add(personObject);
			
		}
		return personarray.toJSONString();
	}

	public static String createJson2(List<Person> personlist) {
		// TODO Auto-generated method stub
		return null;
	}

运行结果
[{“perid”:1001,“perage”:23,“pername”:“zhangsan”,“peraddress”:[{“type”:“home”,“info”:“西安”},{“type”:“work”,“info”:“北京”}]},{“perid”:1002,“perage”:24,“pername”:“lisi”,“peraddress”:[{“type”:“home”,“info”:“上海”},{“type”:“work”,“info”:“重庆”}]},{“perid”:1003,“perage”:25,“pername”:“wangwu”,“peraddress”:[{“type”:“home”,“info”:“广州”},{“type”:“work”,“info”:“西安”}]}]
2.gson-2.8.0.jar第三方的开发包生成json数据

public static String createJson2(List<Person> personlist) {
		return new Gson().toJson(personlist);
	}

运行结果
[{“perid”:1001,“perage”:23,“pername”:“zhangsan”,“peraddress”:[{“type”:“home”,“info”:“西安”},{“type”:“work”,“info”:“北京”}]},{“perid”:1002,“perage”:24,“pername”:“lisi”,“peraddress”:[{“type”:“home”,“info”:“上海”},{“type”:“work”,“info”:“重庆”}]},{“perid”:1003,“perage”:25,“pername”:“wangwu”,“peraddress”:[{“type”:“home”,“info”:“广州”},{“type”:“work”,“info”:“西安”}]}]
3.jackson第三方的开发包生成json数据
“jackson-core-2.9.5.jar”
“jackson-databind-2.9.5.jar”
“jackson-annotations-2.9.5.jar”

public static String createJson3(List<Person> personlist) throws Exception{
		return new ObjectMapper().writeValueAsString(personlist);
		
	}

运行结果
[{“perid”:1001,“perage”:23,“pername”:“zhangsan”,“peraddress”:[{“type”:“home”,“info”:“西安”},{“type”:“work”,“info”:“北京”}]},{“perid”:1002,“perage”:24,“pername”:“lisi”,“peraddress”:[{“type”:“home”,“info”:“上海”},{“type”:“work”,“info”:“重庆”}]},{“perid”:1003,“perage”:25,“pername”:“wangwu”,“peraddress”:[{“type”:“home”,“info”:“广州”},{“type”:“work”,“info”:“西安”}]}]
2.2 JSON数据的解析【json数据—java对象】
1.json-simple-1.1.jar第三方的开发包解析json数据

package util;

import java.io.FileReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import com.wangxing.bean.Person;
import com.wangxing.bean.PersonAddress;

/**
 * 1.json-simple-1.1.jar第三方的开发包解析json数据
 */
public class JSONHelper {
public static List<Person> parseJson1()throws Exception {
	List<Person>  personlist=new ArrayList<Person>();
	//创建一个json解析器对象
	JSONParser   jsonparser=new JSONParser();
	Reader  in=new FileReader("xx.json");
	JSONArray  personArray=(JSONArray)jsonparser.parse(in);
	for(int i=0;i<personArray.size();i++) {
		JSONObject personObject=(JSONObject)personArray.get(i);
		long id=(Long)personObject.get("perid");
		int perid=(int)id;
		String pername=(String)personObject.get("pername");
		long age=(Long)personObject.get("perage");
		int perage=(int)age;
		JSONArray personAddressArray=(JSONArray)personObject.get("peraddress");
		PersonAddress peraddress[]=new PersonAddress[personAddressArray.size()];
		for(int j=0;j<personAddressArray.size();j++) {
	    	JSONObject personAddressObject=(JSONObject)personAddressArray.get(j);
	    	String  type=(String)personAddressObject.get("type");
	    	String  info=(String)personAddressObject.get("info");
	    	PersonAddress  address=new PersonAddress();
	    	address.setType(type);
	    	address.setInfo(info);
	    	peraddress[j]=address;
	    }
	    Person  person =new Person();
	    person.setPerid(perid);
	    person.setPername(pername);
	    person.setPerage(perage);
	    person.setPreaddress(peraddress);
	    personlist.add(person);
	}
	return personlist;
}
}


2.gson-2.8.0.jar第三方的开发包解析json数据

	//2.gson-2.8.0.jar第三方的开发包解析json数据
	public static List<Person>parseJson2()throws Exception{
		Gson gson=new Gson();
		Reader in=new FileReader("xx.json");
		//formJson(String,Class)
		//fromJson(String,Type)
		//formJson(Reader,Class)
		//fromJson(Reader,Type)
		return gson.fromJson(in,new TypeToken<List<Person>>(){}.getType());
		
	}

运行结果

3.jackson第三方的开发包解析json数据

public static List<Person> parseJson3()throws Exception {
		List<Person>personlist=new ArrayList<Person>();
		//创建解析器对象
		ObjectMapper objectMapper=new ObjectMapper();
		JsonNode personNodes=objectMapper.readTree(new FileReader("xx.json"));
		for(int i=0;i<personNodes.size();i++) {
			JsonNode personNode=personNodes.get(i);
			int perid=personNode.get("perid").asInt();
			String pername=personNode.get("pername").asText();
			int perage=personNode.get("perage").asInt();
			JsonNode personAddressNodes=personNode.get("peraddress");
			PersonAddress peraddress[]=new PersonAddress[personAddressNodes.size()];
			for(int j=0;j<personAddressNodes.size();j++) {
				JsonNode addressNode=personAddressNodes.get(j);
				String type=addressNode.get("type").asText();
				String info=addressNode.get("info").asText();
				PersonAddress address=new PersonAddress();
				address.setType(type);
				address.setInfo(info);
				peraddress[j]=address;     
			}
			Person person=new Person();
			person.setPerid(perid);
			person.setPername(pername);
			person.setPerage(perage);
			person.setPreaddress(peraddress);
			personlist.add(person);
		}
		return personlist;
	}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值