生成和解析JSON

本文介绍了JSON作为数据交换格式的特性,展示了如何将Java对象转换为JSON字符串,并讨论了复杂的JSON结构。还提到了JSON数据的生成和解析方法,包括json-simple、gson和jackson等第三方库的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成和解析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":"上海"}

     ]

     注意:

  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数据

       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());
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值