生成和解析JSON

生成和解析JSON

      1.什么是JSON,JSON的作用是什么,如何编写JSON?

      JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式采用完全独立于编程语言的文本格式来存储和表示数据.

      简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言.

      例如:

            一个java对象转换成json对象以后是什么样子?

package com.wangxing.jsondemo1.bean;

public class Person {
	private  int perid;
	private  String  pername;
	private  int  perage;
	private String peraddress;
	public String getPeraddress() {
		return peraddress;
	}
	public void setPeraddress(String peraddress) {
		this.peraddress = peraddress;
	}
	public int getPerid() {
		return perid;
	}
	public void setPerid(int perid) {
		this.perid = perid;
	}
	public String getPername() {
		return pername;
	}
	public void setPername(String pername) {
		this.pername = pername;
	}
	public int getPerage() {
		return perage;
	}
	public void setPerage(int perage) {
		this.perage = perage;
	}
	
}

            //创建一个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.wangxing.test2;
/**
 * 保存地址信息的java类
 * @author Administrator
 *
 */
public class PersonAddress {
	private  String type; //地址类型【家庭/工作】
	private  String info; //地址信息
        public String gettype(){
                return type;
        }
        public void settype(String type){
                this.type=type;
        }
        public String getinfo(){
                return info;
        }
        public void setinfo(String info){
                this.info=info;
        }
}

            //创建三个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数据

package com.wangxing.jsondemo1.Helper;

import java.util.List;

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

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

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数组对象
			JSONArray personAddressArray=new JSONArray();
			for(PersonAddress peraddress:person.getPeraddress()){
				//创建保存地址对象的json对象
				JSONObject addressObject=new JSONObject();
				addressObject.put("type", peraddress.getType());
				addressObject.put("info", peraddress.getInfo());
				personAddressArray.add(addressObject);
			}
			//将地址保存到person对象
			personObject.put("peraddress", personAddressArray);
			perlistarray.add(personObject);
		}
		jsoninfo=perlistarray.toJSONString();
		return jsoninfo;
	}
}

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

package com.wangxing.jsondemo1.Helper;

import java.util.List;

import com.google.gson.Gson;
import com.wangxing.jsondemo1.bean.Person;

public class JsonHelper { 
        /**
	 * 2.gson-2.8.0.jar第三方的开发包生成json数据
	 */
	public static String createJsonBygson(List<Person> personlist){
		String jsoninfo="";
		jsoninfo=new Gson().toJson(personlist);
		return jsoninfo;
	}
}

                  3.jackson第三方的开发包生成json数据

                         “jackson-core-2.9.5.jar”

                         “jackson-databind-2.9.5.jar”

                         “jackson-annotations-2.9.5.jar”

package com.wangxing.jsondemo1.Helper;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wangxing.jsondemo1.bean.Person;

public class JsonHelper {
        /**
	 * 3.jackson第三方的开发包生成JSON数据
	 */
	public static String createJsonByJackson(List<Person> personlist){
		String jsoninfo="";
		try {
			jsoninfo=new ObjectMapper().writeValueAsString(personlist);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return jsoninfo;
	}
}

            2.2JSON数据的解析【json数据---java对象】

                     1.json-simple-1.1.jar第三方的开发包解析json数据

package com.wangxing.jsondemo1.utils;

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.jsondemo1.bean.Person;
import com.wangxing.jsondemo1.bean.PersonAddress;

public class JsonUtils {
	/**
	 * 1.json-simple-1.1.jar第三方的开发包解析json数据
	 */
	public static List<Person> parseJsonBysimple(String json)throws Exception{
		List<Person> personlist = new ArrayList<Person>();
		//创建一个json解析器对象
		JSONParser jsonparser=new JSONParser();
		//利用解析器将json解析为josn数组
		JSONArray perlistArray = (JSONArray) jsonparser.parse(json);
		for(int i=0;i<perlistArray.size();i++){
			Person person = new Person();
			//得到json里的第一层对象
			JSONObject personObject = (JSONObject) perlistArray.get(i);
			long id=(Long) personObject.get("perid");
			int perid=(int)id;
			person.setPerid(perid);
			String pername=(String)personObject.get("pername");
			person.setPername(pername);
			long age=(long) personObject.get("perage");
			int perage=(int)age;
			person.setPerage(perage);
			JSONArray addressArray=(JSONArray) personObject.get("peraddress");
			//定义保存PersonAddress对象的数组
			PersonAddress parAddressArray[]=new PersonAddress[addressArray.size()];
			for(int j=0;j<addressArray.size();j++){
				PersonAddress address=new PersonAddress();
				//获得json里第二层对象
				JSONObject addressObject=(JSONObject) addressArray.get(j);
				String type=(String) addressObject.get("type");
				String info=(String) addressObject.get("info");
				address.setType(type);
				address.setInfo(info);
				parAddressArray[j]=address;
			}
			person.setPeraddress(parAddressArray);
			personlist.add(person);
		}
		return personlist;
	}
}

测试:

package com.wangxing.jsondemo1.test;

import java.util.ArrayList;
import java.util.List;

import com.wangxing.jsondemo1.Helper.JsonHelper;
import com.wangxing.jsondemo1.bean.Person;
import com.wangxing.jsondemo1.bean.PersonAddress;
import com.wangxing.jsondemo1.utils.JsonUtils;

public class TestMain {
	public static void main(String a[]) throws Exception{
		Person person1=new Person();
		person1.setPerid(1001);
		person1.setPername("zhangsan");
		person1.setPerage(23);
		PersonAddress address1=new PersonAddress();
		address1.setType("家庭");
		address1.setInfo("北京");
		PersonAddress address2=new PersonAddress();
		address2.setType("学校");
		address2.setInfo("西安");
		PersonAddress addressarray[]=new PersonAddress[2];
		addressarray[0]=address1;
		addressarray[1]=address2;
		person1.setPeraddress(addressarray);
		
		Person person2 = new Person();
		person2.setPerid(1002);
		person2.setPername("lisi");
		person2.setPerage(24);
		PersonAddress address3 = new PersonAddress();
		address3.setType("家庭");
		address3.setInfo("广州");
		PersonAddress address4 = new PersonAddress();
		address4.setType("学校");
		address4.setInfo("深圳");
		PersonAddress addressarray2[] = new PersonAddress[2];
		addressarray2[0] = address3;
		addressarray2[1] = address4;
		person2.setPeraddress(addressarray2);
		List<Person> personlist = new ArrayList<Person>();
		personlist.add(person1);
		personlist.add(person2);

		//解析json测试
		String json=JsonHelper.createJsonByJackson(personlist);
		List<Person> perlist=JsonUtils.parseJsonBysimple(json);
		
		for(Person per:perlist){
			PersonAddress array[]=per.getPeraddress();
			System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()
							+" "+array[0].getType()+" "+array[0].getInfo()+" "+array[1].getType()+" "+array[1].getInfo());
		}
	}
}

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

package com.wangxing.jsondemo1.utils;

import java.util.List;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.wangxing.jsondemo1.bean.Person;

public class JsonUtils {
        /**
	 * 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());
	}
}

测试:

package com.wangxing.jsondemo1.test;

import java.util.ArrayList;
import java.util.List;

import com.wangxing.jsondemo1.Helper.JsonHelper;
import com.wangxing.jsondemo1.bean.Person;
import com.wangxing.jsondemo1.bean.PersonAddress;
import com.wangxing.jsondemo1.utils.JsonUtils;

public class TestMain {
	public static void main(String a[]) throws Exception{
		Person person1=new Person();
		person1.setPerid(1001);
		person1.setPername("zhangsan");
		person1.setPerage(23);
		PersonAddress address1=new PersonAddress();
		address1.setType("家庭");
		address1.setInfo("北京");
		PersonAddress address2=new PersonAddress();
		address2.setType("学校");
		address2.setInfo("西安");
		PersonAddress addressarray[]=new PersonAddress[2];
		addressarray[0]=address1;
		addressarray[1]=address2;
		person1.setPeraddress(addressarray);
		
		Person person2 = new Person();
		person2.setPerid(1002);
		person2.setPername("lisi");
		person2.setPerage(24);
		PersonAddress address3 = new PersonAddress();
		address3.setType("家庭");
		address3.setInfo("广州");
		PersonAddress address4 = new PersonAddress();
		address4.setType("学校");
		address4.setInfo("深圳");
		PersonAddress addressarray2[] = new PersonAddress[2];
		addressarray2[0] = address3;
		addressarray2[1] = address4;
		person2.setPeraddress(addressarray2);
		List<Person> personlist = new ArrayList<Person>();
		personlist.add(person1);
		personlist.add(person2);

		//解析json测试
		String json=JsonHelper.createJsonByJackson(personlist);
		List<Person> perlist=JsonUtils.parseJsonByGson(json);
		for(Person per:perlist){
			PersonAddress array[]=per.getPeraddress();
			System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()
							+" "+array[0].getType()+" "+array[0].getInfo()+" "+array[1].getType()+" "+array[1].getInfo());
		}
	}
}

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

package com.wangxing.jsondemo1.utils;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wangxing.jsondemo1.bean.Person;
import com.wangxing.jsondemo1.bean.PersonAddress;

public class JsonUtils {        
        /**
	 * 3.jackson第三方的开发包解析json数据
	 */
	public static List<Person> parseJsonByjackson(String json)throws Exception{
		//创建保存数据的集和
		List<Person> personlist = new ArrayList<Person>();
		//创建解析器对象
		ObjectMapper objectMapper = new ObjectMapper();
		//创建保存json中第一层对象的数组[节点集和]
		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);
			int perage=personobj.get("perage").asInt();
			person.setPerage(perage);
			//personlist.add(person);
			//创建保存json中第二层对象的数组[节点集和]
			JsonNode addressArray=personobj.get("peraddress");
			PersonAddress perAddressArray[] = new PersonAddress[addressArray.size()]; 
			for(int j=0;j<addressArray.size();j++){
				PersonAddress address = new PersonAddress();
				//从数组中得到节点对象
				JsonNode addressObj=addressArray.get(j);
				String type=addressObj.get("type").asText();
				address.setType(type);
				String info=addressObj.get("info").asText();
				address.setInfo(info);
				perAddressArray[j]=address;
			}
			person.setPeraddress(perAddressArray);
			personlist.add(person);
		}
		return personlist;
	}
}

测试:

package com.wangxing.jsondemo1.test;

import java.util.ArrayList;
import java.util.List;

import com.wangxing.jsondemo1.Helper.JsonHelper;
import com.wangxing.jsondemo1.bean.Person;
import com.wangxing.jsondemo1.bean.PersonAddress;
import com.wangxing.jsondemo1.utils.JsonUtils;

public class TestMain {
	public static void main(String a[]) throws Exception{
		Person person1=new Person();
		person1.setPerid(1001);
		person1.setPername("zhangsan");
		person1.setPerage(23);
		PersonAddress address1=new PersonAddress();
		address1.setType("家庭");
		address1.setInfo("北京");
		PersonAddress address2=new PersonAddress();
		address2.setType("学校");
		address2.setInfo("西安");
		PersonAddress addressarray[]=new PersonAddress[2];
		addressarray[0]=address1;
		addressarray[1]=address2;
		person1.setPeraddress(addressarray);
		
		Person person2 = new Person();
		person2.setPerid(1002);
		person2.setPername("lisi");
		person2.setPerage(24);
		PersonAddress address3 = new PersonAddress();
		address3.setType("家庭");
		address3.setInfo("广州");
		PersonAddress address4 = new PersonAddress();
		address4.setType("学校");
		address4.setInfo("深圳");
		PersonAddress addressarray2[] = new PersonAddress[2];
		addressarray2[0] = address3;
		addressarray2[1] = address4;
		person2.setPeraddress(addressarray2);
		List<Person> personlist = new ArrayList<Person>();
		personlist.add(person1);
		personlist.add(person2);

		//解析json测试
		String json=JsonHelper.createJsonByJackson(personlist);
		List<Person> perlist=JsonUtils.parseJsonByjackson(json);
		for(Person per:perlist){
			PersonAddress array[]=per.getPeraddress();
			System.out.println(per.getPerid()+" "+per.getPername()+" "+per.getPerage()
							+" "+array[0].getType()+" "+array[0].getInfo()+" "+array[1].getType()+" "+array[1].getInfo());
		}
	}
}

猜你喜欢

转载自blog.csdn.net/m0_49935332/article/details/114160737