一.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...