java中json库和gson库的使用(慕课网JSON快速入门Java版笔记)

一.json定义

      json是当今较为广泛使用的数据传输格式。优势在于 :简洁和清晰的层次结构,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。json与开发语言无关并且是轻量级的,是javascript Object Notation的简称。

二.简单json示例

{
	"name" : "王小二",
	"age" : 25.2,
	"birthday" : "1990-03-05",
	"school" : "蓝翔",
	"major" : ["理发", "挖掘机"],
	"has_girlfriend" : false,
	"car" : null,
	"house" : null,
	"comments" : "这是一个注释"
}

      代表了一个对象,并且是k/v的存储(键值对存储,且键必须是下述数据类型中基本类型中的string类型)

三.json中不同的数据表示

主要分两大类:1.数据结构 2.基本类型

1.数据结构中包括Object与Array两种类型

Object :包含键值对,key必须是string类型(双引号括起来的字符串),value为任意数据类型包括Object以及后面所提到的Array类型和基本类型。例:上述整个简单json示例

Array :望文生义,与java中的数组含义类似,但表达形式不同。使用中括号括起来,逗号分隔,例:["理发"', "挖掘机"]

2.基本类型

string,number,true,false,null

需要特别注意的是json格式中 number,不分int float double 数据类型,string为字符串,true,false为布尔变量,null为空对象

四.json库和gson库和commons-io库资源下载


https://pan.baidu.com/s/1-NQ7_8sEih4DRdFPpmxxrw

密码:27nj

五.json库创建json对象(JSONObject)代码示例 

共有三种方式创建json对象:

1.创建空的JSONObject,调用其put方法赋于键值对

2.将键值对用Map封装,并作为JSONObject的构造器参数传入

3.使用初始化后的Bean作为JSONObject构造器参数传入

package json;

import java.util.HashMap;
import java.util.Map;

import org.json.*;

import bean.DiaoSi;

//{
//	"name" : "王小二",
//	"age" : 25.2,
//	"birthday" : "1990-01-01",
//	"school" : "蓝翔",
//	"major" : ["理发","挖掘机"],
//	"has_girlfriend" : false,
//	"car" : null,
//	"house" : null,
//	"comments" : "这是一个注释"
//}
public class JsonObjectSample {
	public static void main(String[] args) {
		jsonObject();
		createJsonByMap();
		createJsonByBean();
	}

	/**
	 * 
	 * void
	 */
	private static void createJsonByMap() {
		// TODO Auto-generated method stub
		Map<String, Object> wang = new HashMap<>();
		Object nullObject = null;
		wang.put("name", "王小二");
		wang.put("age", 25.2);
		wang.put("birthday","1990-10-1");
		wang.put("major", new String[] {"理发", "挖掘机"});
		wang.put("has_girlfriend",false);
		// 存在二义性 null 需要创建一个对象来跳过编译器的检查
//		wang.put("car", null);
		wang.put("car", nullObject);
		wang.put("house", nullObject);
		// put 同一键 产生替代效果 
		wang.put("comment", "这是一个注释");
		System.out.println(new JSONObject(wang).toString());
	}

	/**
	 * 
	 * void
	 */
	private static void jsonObject() {
		// TODO Auto-generated method stub
		JSONObject jsonObject = new JSONObject();
		Object nullObject = null;
		jsonObject.put("name", "王小二");
		jsonObject.put("age", 25.2);
		jsonObject.put("birthday","1990-10-1");
		jsonObject.put("major", new String[] {"理发", "挖掘机"});
		jsonObject.put("has_girlfriend",false);
		// 存在二义性 null 需要创建一个对象来跳过编译器的检查
//		jsonObject.put("car", null);
		jsonObject.put("car", nullObject);
		// put 同一键 产生替代效果 
		jsonObject.put("comment", "这是一个注释");
		System.out.println(jsonObject.toString());
	}
	
	private static void createJsonByBean() {
		DiaoSi wang = new DiaoSi();
		wang.setBirthday("1990-10-1");
		wang.setAge(25.2);
		wang.setCar(null);
		wang.setHas_girlfriend(false);
		wang.setMajor(new String[] {"理发", "挖掘机"});
		wang.setComment("这是一个注释");
		wang.setName("王小二");
		System.out.println(new JSONObject(wang));
	}
}

三个方法结果运行均为:{"birthday":"1998-10-1","major":["理发","挖掘机"],"name":"王小二","has_girlfriend":false,"comment":"这是一个注释","age":25.2}

bean.Diaosi.java    (javaBean) 

package bean;
import java.util.Arrays;

public class DiaoSi {
	@SerializedName("NAME")
	private String name;
	private String school;
	private String birthday;
	private String[] major;
	private boolean has_girlfriend;
	private Object car;
	private Object house;
	private double age;
	private String comment;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String[] getMajor() {
		return major;
	}
	public void setMajor(String[] major) {
		this.major = major;
	}
	public boolean isHas_girlfriend() {
		return has_girlfriend;
	}
	public void setHas_girlfriend(boolean has_girlfriend) {
		this.has_girlfriend = has_girlfriend;
	}
	public Object getCar() {
		return car;
	}
	public void setCar(Object car) {
		this.car = car;
	}
	public Object getHouse() {
		return house;
	}
	public void setHouse(Object house) {
		this.house = house;
	}
	public double getAge() {
		return age;
	}
	public void setAge(double age) {
		this.age = age;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	
	@Override
	public String toString() {
		return "DiaoSi [name=" + name + ", school=" + school + ", birthday=" + birthday + ", major="
				+ Arrays.toString(major) + ", has_girlfriend=" + has_girlfriend + ", car=" + car + ", house=" + house
				+ ", age=" + age + ", comment=" + comment + "]";
	}
	
}

缺点:不能将json文件反解析为javaBean,json库不支持javaBean中日期格式

六.json库反解析json对象代码示例 

反解析较为简单,根据键值对中的值的类型来使用对应的JSONObject的get方法,例如getString,较为特殊的为数组。使用getArray获得JSONArray对象,通过对该对象的get方法,参数为索引值,获取数组中的值。

package json;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;

public class ReadJsonSample {
	public static void main(String[] args) throws IOException {
		File file = new File("src/wangxiaoer.json");
		String content = FileUtils.readFileToString(file);
		System.out.println(content);
		JSONObject jsonObject = new JSONObject(content);
		System.out.println("姓名是"+jsonObject.getString("name"));
		JSONArray jsonArray = jsonObject.getJSONArray("major");
		for(int i=0; i<jsonArray.length(); i++) {
			System.out.println(jsonArray.get(i));
		}
	}
}

七.gson库创建json数据代码示例 

概述:相较于json库,gson库由谷歌公司开发。功能更为强大,有许多个性化的定制。

例如:

1.可使用注解使创建出的json数据的键,根据javaBean中对应属性上的注解,使json数据的该键与自定义的注解值相等。

例如(在DiaoSi的name属性上注解@SerializedName("NAME"))

2.GsonBuilder类 setPrettyPrinting方法,使产生的json数据格式化的输出。

3.GsonBuilder类 setFieldNamingStrategy方法,可更改字段名字策略,进行自定义命名。

4.支持transient修饰符,在javaBean中字段用该修饰符修饰时,生成的json数据中,不含该字段信息。

package gson;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import bean.DiaoSi;

public class GSONCreateSample {
	public static void main(String[] args) {
		CreateJsonByBean();
	}

	
	private static void CreateJsonByBean() {
		// TODO Auto-generated method stub
		DiaoSi wang = new DiaoSi();
		wang.setName("王小二");
		wang.setAge(21);
		wang.setCar(null);
		wang.setBirthday("1990-01-01");
		wang.setIgnore("这是被隐藏的");
		GsonBuilder builder = new GsonBuilder();
		builder.setPrettyPrinting();
		Gson gson = builder.create();
		System.out.println(gson.toJson(wang));
	}
	
}

javaBean在上述bean.Diaosi.java 的基础上增加ignore字段,并用transient修饰 

运行结果:

{
  "NAME": "王小二",
  "birthday": "1990-01-01",
  "has_girlfriend": false,
  "age": 21.0
}

八.gson库反解析json数据成javaBean代码示例 

特点:

1.支持反解析为javaBean

2.支持Date格式(yy-MM-dd)年-月-日 !!不能写成(yy-mm-dd)小写m代表分钟

3.支持集合类

/**
 * 
 */
package gson;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import bean.DiaoSi;
import bean.DiaoSi2;
import bean.DiaoSi3;

/**
 * @author hp
 *
 */
public class GSONReadSample {
	
	public static void main(String[] args) throws IOException {
		GsonRead();
		GsonReadWithDateFormat();
		GsonReadCollection();
	}
	
	private static void GsonRead() throws IOException {
		File file = new File(GSONReadSample.class.getResource("/wangxiaoer.json").getFile());
		String content = FileUtils.readFileToString(file);
		Gson gson = new Gson();
		DiaoSi diaosi = gson.fromJson(content, DiaoSi.class);
		System.out.println(diaosi);
	}
	
	private static void GsonReadWithDateFormat() throws IOException {
		File file = new File(GSONReadSample.class.getResource("/wangxiaoer.json").getFile());
		String content = FileUtils.readFileToString(file);
		GsonBuilder builder = new GsonBuilder();
		builder.setDateFormat("yyyy-MM-dd").create();
		Gson gson = builder.create();
		DiaoSi2 diaosi2 = gson.fromJson(content, DiaoSi2.class);
		System.out.println(diaosi2);
		System.out.println(diaosi2.getBirthday().toLocaleString());
	}
	
	private static void GsonReadCollection() throws IOException {
		File file = new File(GSONReadSample.class.getResource("/wangxiaoer.json").getFile());
		String content = FileUtils.readFileToString(file);
		GsonBuilder builder = new GsonBuilder();
		builder.setDateFormat("yyyy-MM-dd").create();
		Gson gson = builder.create();
		DiaoSi3 diaosi3 = gson.fromJson(content, DiaoSi3.class);
		System.out.println(diaosi3);
		System.out.println(diaosi3.getBirthday().toLocaleString());
		
		System.out.println(diaosi3.getMajor());
		System.out.println(diaosi3.getMajor().getClass());
	}
}

DiaoSi.java

package bean;

import java.util.Arrays;

import com.google.gson.annotations.SerializedName;
public class DiaoSi {
	@SerializedName("NAME")
	private String name;
	private String school;
	private String birthday;
	private String[] major;
	private boolean has_girlfriend;
	private Object car;
	private Object house;
	private double age;
	private String comment;
	private transient String ignore;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String[] getMajor() {
		return major;
	}
	public void setMajor(String[] major) {
		this.major = major;
	}
	public boolean isHas_girlfriend() {
		return has_girlfriend;
	}
	public void setHas_girlfriend(boolean has_girlfriend) {
		this.has_girlfriend = has_girlfriend;
	}
	public Object getCar() {
		return car;
	}
	public void setCar(Object car) {
		this.car = car;
	}
	public Object getHouse() {
		return house;
	}
	public void setHouse(Object house) {
		this.house = house;
	}
	public double getAge() {
		return age;
	}
	public void setAge(double age) {
		this.age = age;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	public String getIgnore() {
		return ignore;
	}
	public void setIgnore(String ignore) {
		this.ignore = ignore;
	}
	@Override
	public String toString() {
		return "DiaoSi [name=" + name + ", school=" + school + ", birthday=" + birthday + ", major="
				+ Arrays.toString(major) + ", has_girlfriend=" + has_girlfriend + ", car=" + car + ", house=" + house
				+ ", age=" + age + ", comment=" + comment + "]";
	}
	
}

DiaoSi2.java

private Date birthday;//将DiaoSi.java内的birthday属性的数据类型转换为Date

DiaoSi3.java

private List<String> major;//将DiaoSi2.java的major属性的数据类型转换为List<String>

wangxiaoer.json

{
	"name" : "王小二",
	"age" : 25.2,
	"birthday" : "1990-03-05",
	"school" : "蓝翔",
	"major" : ["理发","挖掘机"],
	"has_girlfriend" : false,
	"car" : null,
	"house" : null,
	"comments" : "这是一个注释"
}

运行结果:

DiaoSi [name=null, school=蓝翔, birthday=1990-03-05, major=[理发, 挖掘机], has_girlfriend=false, car=null, house=null, age=25.2, comment=null]
DiaoSi2 [name=null, school=蓝翔, birthday=Mon Mar 05 00:00:00 CST 1990, major=[理发, 挖掘机], has_girlfriend=false, car=null, house=null, age=25.2, comment=null]
1990-3-5 0:00:00
DiaoSi3 [name=null, school=蓝翔, birthday=Mon Mar 05 00:00:00 CST 1990, major=[理发, 挖掘机], has_girlfriend=false, car=null, house=null, age=25.2, comment=null]
1990-3-5 0:00:00
[理发, 挖掘机]
class java.util.ArrayList

总结gson库反解析json数据

读取json文件反解析为javaBean关键代码,

Gson gson = new Gson();
DiaoSi diaosi = gson.fromJson(content, DiaoSi.class);

利用反射机制,将要转换成的javaBean对象的类类型作为参数传入。

当javaBean对象含日期格式,使用GsonBuilder,设置json中字符串与bean中日期格式的对应关系

GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy-mm-dd").create();
Gson gson = builder.create();

当javaBean对象含集合类时,gson库根据Bean中的类型自动转换为具体实现类,例如List会转换为ArrayList...

猜你喜欢

转载自blog.csdn.net/qq_41175067/article/details/81315577
今日推荐