1.JSON
JSON简介: 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON:是行业内使用最为广泛的数据传输格式。
(调用服务端)API时会使用JSON作为返回格式。
JSON是数据存储的一种格式,格式简单,易于读写,格式都是压缩的,占用带宽小。
最初来自JS,后来几乎每种常用语言都有处理JSON的API,支持多种服务器端语言,便于服务器端的解析。
JSON缺点:要求字符集必须是Unicode,受约束性强。
①JSON是一种与开发语言无关的、轻量级的数据格式。全称为JavaScript Object Notation。
优点:易于人的阅读和编写,易于程序解析与生产。
②实例:
{ }:标识一个对象(即结构体)。
{ }中包含键值对结构,key必须是String类型,value为任何基本类型或数据结构。
[ ]:代表数组Array,并用逗号,来分隔元素。
基本类型:String、number、true、false、null。
ps:(没有浮点整数、正负数...之分,在写java代码时,JSONObject的put方法会自动区分不同数字格式。)
这是一种JSONObject原生数据格式到java数据格式的映射关系。
元素可以是任意类型。
标准JSON不支持任何形式注释。
json没有日期数据格式。
③org.json包的使用:
a.生成JSON对象:
package json;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
/**
* @Auther: wjy
* @Date: 2018/10/10 16:34
* @Description: 使用JSONObject相关构建JSON对象。
*/
public class jsonTest {
public static void main(String[] args) {
jsonobject();// 使用JSONObject构建JSON对象。
createJsonByMap();// 通过HashMap数据结构构建JSON对象。
createjavaBean();// 通过Javabean来构建JSON对象。
}
private static void jsonobject() {
JSONObject messi = new JSONObject();// 构建JSON对象。
Object NULL = null;
try {
messi.put("name","messi");
messi.put("name","梅西");// 替代性,二次赋值会代替第一次赋值。
messi.put("age",31.4);
messi.put("birthday","1987-06-24");
messi.put("school","Barcelona");
messi.put("major",new String[]{"player","star"});// 也可以使用集合装数组。
messi.put("car",true);
messi.put("house",true);
messi.put("daughter",NULL);// 直接复制null会产生二义性。
messi.put("girlfriend","安东内拉");
messi.put("comment","love him!!");
System.out.println(messi/*或messi.toString()*/);// 不会按照插入数据顺序显示。
/*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","house":true,"age":31.4}*/
} catch (JSONException e) {
e.printStackTrace();
}
}
private static void createJsonByMap() {
HashMap<String,Object> messi = new HashMap<String, Object>();
Object NULL = null;
messi.put("name","messi");
messi.put("name","梅西");
messi.put("age",31.4);
messi.put("birthday","1987-06-24");
messi.put("school","Barcelona");
messi.put("major",new String[]{"player","star"});
messi.put("car",true);
messi.put("house",true);
messi.put("daughter",NULL);
messi.put("girlfriend","安东内拉");
messi.put("comment","love him!!");
System.out.println(new JSONObject(messi)/*或new JSONObject(messi).toString()*/);
/*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","house":true,"daughter":null,"age":31.4}*/
// 构造函数支持传入Map接口对象 将Map转换为JSON。
}
private static void createjavaBean() {
beanTest messi = new beanTest();
Object NULL = null;
messi.setName("messi");
messi.setName("梅西");
messi.setAge(31.4);
messi.setBirthday("1987-06-24");
messi.setSchool("Barcelona");
messi.setMajor(new String[]{"player","star"});
messi.setCar(true);
messi.setHouse(true);
messi.setDaughter(NULL);
messi.setGirlfriend("安东内拉");
messi.setComment("love him!!");
System.out.println(new JSONObject(messi/*messi.toString()*/));// 最终的方式还是使用JSONObject。
// 但是并没有把属性置于JSONObject中。
/*{"birthday":"1987-06-24","girlfriend":"安东内拉","major":["player","star"],"school":"Barcelona","car":true,"name":"梅西","comment":"love him!!","daughter":null,"house":true,"age":31.4}*/
}
}
package json;
/**
* @Auther: wjy
* @Date: 2018/10/10 17:21
* @Description: JavaBean。
*/
public class beanTest {
private String name;
private double age;
private String birthday;
private String school;
private String[] major;
private Boolean car;
private Boolean house;
private String girlfriend;
private Object daugter;
private String comment;
public beanTest(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
b.解析json数据格式:通过文件读取/远程API获取数据内容,再转换为JSONObject。
package json;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @Auther: wjy
* @Date: 2018/10/10 18:31
* @Description: 解析json数据格式。
* JSONObject不支持使用JavaBean反解析json。
*/
public class readJsonTest {
public static void main(String[] args) throws IOException, JSONException {
File file = new File(readJsonTest.class.getResource("../messi.json").getFile());// class的方法获取文件。
// 快速读取内容。
String content = FileUtils.readFileToString(file);// 读取文件内容。
JSONObject json = new JSONObject(content);// 将读取内容转换为json对象。
// bug:
// JSONArray majorArray = new JSONArray("major");// 需要JSONArray解析json数组。
if( !json.isNull("name")) {// 通过此方法,增加程序健壮性。
System.out.println("姓名: " + json.getString("name"));
}
System.out.println("年龄: "+json.getDouble("age"));
System.out.println("生日: "+json.getString("birthday"));
System.out.println("学校: "+json.getString("school"));
// bug:
/*for(int i=0; i<majorArray.length(); i++) {
String m = majorArray.getString(i);
System.out.println("专业"+(1+i)+m);
}*/
System.out.println("有车车吗: "+json.getBoolean("car"));
System.out.println("有房房吗: "+json.getBoolean("house"));
System.out.println("有女朋友吗: "+json.getString("girlfriend"));
System.out.println("有女儿吗: "+json.getString("daughter"));
System.out.println("注释: "+json.getString("comment"));
/*
姓名: 梅西
年龄: 31.4
生日: 1987-06-24
学校: Barcelona
有车车吗: true
有房房吗: true
有女朋友吗: 安东内拉
有女儿吗: null
注释: love him!
*/
}
}
2.GSON
谷歌提出的,开源的第三方工具。
相比于JSONObject,功能更加强大,性能更加出色,使用方式更加简单和便捷。
①GSON生成JSON数据:
为了改变某一确定的配置,可以使用GsonBuilder创建Gson实例,并自定义各种配置。
GsonBuilder类提供了.Create()方法,该方法返回一个Gson实例。
该Gson实例可以做任何之前已经向你展示的功能:映射任何从JSON来或者到JSON去的数据。
Gson gson = new Gson();
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
package gson;
import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.lang.reflect.Field;
/**
* @Auther: wjy
* @Date: 2018/10/11 10:13
* @Description: 生成Json数据。
*/
public class createJavaBean {
public static void main(String[] args) {
beanTest1 messi = new beanTest1();
Object NULL = null;
messi.setName("messi");
messi.setName("梅西");
messi.setAge(31.4);
messi.setBirthday("1987-06-24");
messi.setSchool("Barcelona");
messi.setMajor(new String[]{"player", "star"});
messi.setCar(true);
messi.setHouse(true);
messi.setDaughter(NULL);
messi.setGirlfriend("安东内拉");
messi.setComment("love him!!");
// 通过注解将name变为NAME。
// 即在构建过程中个性化。
Gson g1 = new Gson();
System.out.println(g1.toJson(messi));// 生成JSON数据。
/*{"NAME":"梅西","age":31.4,...}*/
// 通过传入回调参数将age变为AGE。
GsonBuilder g2 = new GsonBuilder();
g2.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
if (field.getName().equals("age")) {// key为age时,变为AGE。
return "AGE";
}
return field.getName();// 否则正常返回。
}
});
g1 = g2.create();
System.out.println(g1.toJson(messi));// 生成Json数据。
/*{"NAME":"梅西","AGE":31.4,...}*/
// 美化json格式,返回美丽的格式。
g2.setPrettyPrinting();// 美化格式。
g1 = g2.create();
System.out.println(g1.toJson(messi));// 生成Json数据。
/*{
"NAME": "梅西",
"AGE": 31.4,
"birthday": "1987-06-24",
"school": "Barcelona",
"major": [
"player",
"star"
],
"car": true,
"house": true,
"girlfriend": "安东内拉",
"comment": "love him!!"
}
*/
// 要在JavaBean中构建json时隐藏某个属性。
// 即运行时看不到这个属性,private transient String ignore。
messi.setIgnore("I love you!");
System.out.println(g1.toJson(messi));// 生成Json数据。
}
}
package gson;
import com.google.gson.annotations.SerializedName;
public class beanTest1 {
@SerializedName("NAME")
// 通过添加注解的方式,标识生成json格式数据的一个key。
// 将name转换为NAME,相当于解析的时候重新命名。
// GSON有更强的灵活性。
private String name;
private double age;
private String birthday;
private String school;
private String[] major;
private Boolean car;
private Boolean house;
private String girlfriend;
private Object daughter;
private String comment;
public beanTest1(){}
private transient String ignore;
// 用这种定义方式隐藏属性。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
public String getIgnore() {
return ignore;
}
public void setIgnore(String ignore) {
this.ignore = ignore;
}
}
②GSON解析JSON数据格式:
package gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
/**
* @Auther: wjy
* @Date: 2018/10/11 20:00
* @Description: Gson解析。
*/
public class readGsonTest {
public static void main(String[] args) throws IOException {
File file = new File(readGsonTest.class.getResource("../messi.json").getFile());
// class的方法获取文件。
// 快速读取内容。
String content = FileUtils.readFileToString(file);// 读取文件内容。
// Gson解析(带日期转换)
// json是不支持日期格式的,但java支持,所以在java中解析json时,
// 使用GsonBuilder的setDateFormat("yyyy-MM-dd")方法可以转换成Date格式。
Gson g1 = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
// 即把符合这个模板格式的日期字符串(json中birthday的value)转换成Date类型(Javabean中birthday值)。
beanTest2 messi = g1.fromJson(content, beanTest2.class);
System.out.println(messi.getBirthday());
// Wed Jun 24 00:00:00 CDT 1987。
messi = g1.fromJson(content, beanTest2.class);
// Json反向解析成Javabean对象。
System.out.println(messi.toString());// gson.beanTest1@........。
System.out.println(messi);// gson.beanTest1@........。
System.out.println(messi.getGirlfriend());// 安东内拉。
System.out.println(messi.getAge());// 31.4。
// 将json数组与Java中集合类无缝对接。
// 即将json中的数组自动转换为Javabean中的集合类型。
// 实际开发中,常用集合类代替数据,集合有更多特性,可满足不同应用。
System.out.println(messi.getMajor());// [player, star]。
System.out.println(messi.getMajor().getClass());// class java.util.ArrayList。
}
}
package gson;
import java.util.Date;
import java.util.List;
public class beanTest2 {
private double age;
private Date birthday;
private List<String> major;
private String girlfriend;
public beanTest2(){}
public double getAge() {
return age;
}
public void setAge(double age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public List<String> getMajor() {
return major;
}
public void setMajor(List<String> major) {
this.major = major;
}
public String getGirlfriend() {
return girlfriend;
}
public void setGirlfriend(String girlfriend) {
this.girlfriend = girlfriend;
}
}
3.其他
JSON是Android SDK官方的库。
GSON应用于服务端开发,功能更强大。
4.阿里
未完待续。