定义:
JSON是一种与开发语言无关的、轻量级的数据格式。全称为JavaScript Object Notation。
优点:易于人的阅读和编写,易于程序解析和生产。
标准的JSON数据表示
数据结构
Object
Array
基本类型
String、number、true、false、null。
数据结构-Object:
使用花括号{}包含的键值对结构,Key必须是String类型,value为任何基本类型或数据结构。
数据结构-Array
使用中括号[ ]来起始,并用逗号,分隔元素。
{
"name":"张三",
"age":25,
"birthday":"1990-01-01",
"school":"蓝翔",
"major":["理发","挖掘机"],
"has_girlfirend":false,
"car":null,
"house":null
}
注:
json中没有日期这个数据格式,一般用字符串表示
json不支持任何形式的注释,可以采取下面的方式添加注释:
“comment”:”这是一个注释”
JSON的使用
添加JSON包的依赖
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
</dependency>
在java中使用JSON
1.使用put方法构建JSON
import org.json.JSONException;
import org.json.JSONObject;
public class JSONObjectSample {
public static void main(String[] args) {
jsonObject();
}
public static void jsonObject(){
JSONObject wangxiaoer = new JSONObject();
Object nullObj = null;
try {
wangxiaoer.put("name","wangxiaoer");
wangxiaoer.put("age",25.2);
wangxiaoer.put("birthday","1990-01-01");
wangxiaoer.put("major",new String[]{"理发","挖掘机"});
wangxiaoer.put("has_girlfriend",false);
wangxiaoer.put("car",nullObj);
wangxiaoer.put("house",nullObj);
wangxiaoer.put("comment","这是一个注释");
System.out.println(wangxiaoer.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
2.使用Map构建JSON
public static void createJsonByMap(){
Map<String,Object> wangxiaoer = new HashMap<String,Object>();
Object nullObj = null;
wangxiaoer.put("name","wangxiaoer");
wangxiaoer.put("age",25.2);
wangxiaoer.put("birthday","1990-01-01");
wangxiaoer.put("major",new String[]{"理发","挖掘机"});
wangxiaoer.put("has_girlfriend",false);
wangxiaoer.put("car",nullObj);
wangxiaoer.put("house",nullObj);
wangxiaoer.put("comment","这是一个注释");
System.out.println(new JSONObject(wangxiaoer).toString());
}
3.使用Java Bean构建对象
public static void createJsonByBean(){
Diaosi wangxiaoer= new Diaosi();
wangxiaoer.setName("王小二");
wangxiaoer.setAge(25.2);
wangxiaoer.setBirthday("1990-01-01");
wangxiaoer.setSchool("蓝翔");
wangxiaoer.setMajor(new String[]{"理发","挖掘机"});
wangxiaoer.setHas_girlfriend(false);
wangxiaoer.setCar(null);
wangxiaoer.setHouse(null);
wangxiaoer.setComment("这是一个注释");
System.out.println(new JSONObject(wangxiaoer));
}
4.从文件读取JSON
添加依赖,便于文件读取。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
main方法
public static void main(String[] args) throws IOException, JSONException {
//1.得到文件对象并解析
File file = new File(ReadJSONSample.class.getResource("/wangxiaoer.json").getFile());
String content = FileUtils.readFileToString(file);
JSONObject jsonObject = new JSONObject(content);
System.out.println("姓名是:"+jsonObject.get("name"));
System.out.println("年龄:"+jsonObject.get("age"));
System.out.println("有没有女朋友?"+jsonObject.getBoolean("has_girlfriend"));
JSONArray majorArray = jsonObject.getJSONArray("major");
for(int i=0;i<majorArray.length();i++){
String m = (String) majorArray.get(i);
System.out.println("专业-"+(i+1)+m);
}
}
5.从文件中读取JSON判断null
if(!jsonObject.isNull("name")){
System.out.println("姓名是:"+jsonObject.get("name"));
}
6.GSON生成JSON数据
Gson的特性:
1./告诉gson在转化为json对象时将name改为NAME/
@SerializedName(“NAME”)
private String name;
Diaosi实体类:
Diaosi.class
import com.google.gson.annotations.SerializedName;
public class Diaosi {
/*告诉gson在转化为json对象时将name改为NAME*/
@SerializedName("NAME")
private String name;
private String school;
private boolean has_girlfriend;
private double age;
private Object car;
private Object house;
private String[] major;
private String comment;
private String birthday;
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 boolean isHas_girlfriend() {
return has_girlfriend;
}
public void setHas_girlfriend(boolean has_girlfriend) {
this.has_girlfriend = has_girlfriend;
}
public double getAge() {
return age;
}
public void setAge(double age) {
this.age = age;
}
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 String[] getMajor() {
return major;
}
public void setMajor(String[] major) {
this.major = major;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
main方法:
public static void main(String[] args) {
Diaosi wangxiaoer= new Diaosi();
wangxiaoer.setName("王小二");
wangxiaoer.setAge(25.2);
wangxiaoer.setBirthday("1990-01-01");
wangxiaoer.setSchool("蓝翔");
wangxiaoer.setMajor(new String[]{"理发","挖掘机"});
wangxiaoer.setHas_girlfriend(false);
wangxiaoer.setCar(null);
wangxiaoer.setHouse(null);
wangxiaoer.setComment("这是一个注释");
Gson gson = new Gson();
System.out.println(gson.toJson(wangxiaoer));
}
运行结果:
{“NAME”:”王小二”,”school”:”蓝翔”,”has_girlfriend”:false,”age”:25.2,”major”:[“理发”,”挖掘机”],”comment”:”这是一个注释”,”birthday”:”1990-01-01”}
2.GsonBuilder将json数据美化
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
//Gson gson = new Gson();
System.out.println(gson.toJson(wangxiaoer));
运行结果:
{
“NAME”: “王小二”,
“school”: “蓝翔”,
“has_girlfriend”: false,
“age”: 25.2,
“major”: [
“理发”,
“挖掘机”
],
“comment”: “这是一个注释”,
“birthday”: “1990-01-01”
}
3.用GSON在解析json对象时使用自定义的策略
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){
@Override
public String translateName(Field field) {
if(field.getName().equals("name")){
return "NAME";
}
return field.getName();
}
});
Gson gson = gsonBuilder.create();
//Gson gson = new Gson();
System.out.println(gson.toJson(wangxiaoer));
4.private transient String birthday;
在实体类的属性前加transient,声明在生成json时,忽略这个属性。
5.可以反向解析,直接解析为实体类而JSONObject只能解析为JSONObject。
//1.得到文件对象并反解析
File file = new File(ReadJSONSample.class.getResource(“/wangxiaoer.json”).getFile());
String content = FileUtils.readFileToString(file);
Gson gson = new Gson();
Diaosi wangxuaier = gson.fromJson(content,Diaosi.class);
6.GSON解析 带日期转换
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
DiaosiWithBirthday wangxiaoer = gson.fromJson(content,DiaosiWithBirthday.class);
System.out.println(wangxiaoer.getBirthday());
7.集合类解析
Gson识别集合直接反解析为集合实例
功能:
映射java Object与json格式数据
判断json库好不好的标准
1.通过Annotation注解来声明。
2.支持自定义属性名称
3.支持包含或排除属性
4.支持自定义接口自己完成解析/生成过程