目录
一、概述
- JSON(JavaScript Object Notation)
- 指的是JS对象简谱,是一种轻量级的数据交换格式
- 是欧洲计算机协会制定的JavaScript规范,与java语言无关
- 数据交换格式指的是客户端与服务器、程序与程序之间在数据交换时的数据格式
- 采取了完全独立于编程语言的文本格式来存储数据
- 指的是JS对象简谱,是一种轻量级的数据交换格式
- 常用于数据传输
- 相较于XML的优点
- 程序员解析json比解析xml简单
- 机器解析json的效率比xml快
- 数据传输时,json所占的空间更小,网络的传输速度更快
二、JSON的对象与数组
1、json的对象表示
- json中的对象由一个大括号表示
- 括号中描述对象的属性
- 对象的属性通过键值对来描述,可以理解为大括号中包含的是一个个键值对
- 括号中描述对象的属性
- 格式
- 键与值之间使用冒号连接,多个键值对之间使用逗号分隔
- 键值对的键应使用引号引住
- 通常java解析时,键不使用引号会报错,而JavaScript(以下简称js)能正确解析
- 也就是说,建议键值对的键用引号引住
- 键值对的值,可以是js中的任意类型数据
- 对象中键值对的值,可以是对象,也可以数组
- 即可以和数组嵌套使用
- 举例
- 见下面json数组中的例子
2、json的数组表示
- json中的数组用中括号表示,可以与对象相互嵌套
- 格式
- [元素1,元素2...]
- 举例
- 最外层的大括号表示一个对象,对象内有5个属性:name、age、pengyou、info、嘿嘿
- 其中,pengyou属性是一个数组,数组内部又有一个对象,即大括号代表的部分
- heihei属性表示的也是一个对象
{
"name":"小明",
"age":18,
"pengyou":["张三","李四","王二","麻子",{"name":"ovo",
"info":"像匹野马一样狂奔在技术钻研的道路上"}],
"heihei":{
"name":"大长刀",
"length":"40m"
}
}
三、JSON在java中的使用
- java与json的关系
- 可以将java中的对象快速的转换为json格式的字符串
- 可以将json格式的字符串转换为java的对象
- java与json的转换通常会借助第三方的工具类,这里介绍谷歌的Gson和阿里的FastJson
- 第三方库可以选择使用maven配置,或者去GitHub上下载开源的jar包
1、Gson
- 将对象转换为json字符串的步骤
- 导入jar包
- 在需要转换json字符串的位置编写如下代码
String json = new Gson().toJSON("要转换的对象");
案例:
Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(json);
- 将json字符串转换为对象的步骤
- 导入jar包
- 在需要转换java对象的位置编写如下代码
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰
\",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
Book book = new Gson().fromJson(json, Book.class);
System.out.println(book);
- 举例
- 通过例子我们会发现,json转对象时,如果数据代表的对象不存在,我们可以使用HashMap替代
- json数据中的数组,转换为对象后是ArrayList,而不是数组
import com.google.gson.Gson;
import java.util.HashMap;
public class demo1 {
//测试Gson
public static void main(String[] args) {
Student student = new Student("张三", 18);
//将对象转化为json数据
String json1 = new Gson().toJson(student);
System.out.println(json1); //{"name":"张三","age":18}
//将json数据转化为student对象
String text = "{\"name\":\"张三\",\"age\":18}";
Student student1 = new Gson().fromJson(text, Student.class);
System.out.println(student1); //Student{name='张三', age=18}
//将json数据(含数组)转化为对象
//json数据:{"name":"小李","age":18,"page":["第一页","第二页","第三页","第四页"]}
String text2 = "{\"name\":\"小李\",\"age\":18,\"page\":[\"第一页\",\"第二页\",\"第三页\",\"第四页\"]}";
HashMap data = new Gson().fromJson(text2, HashMap.class);
System.out.println(data.get("page")); //[第一页, 第二页, 第三页, 第四页]
System.out.println(data.get("page").getClass()); //class java.util.ArrayList
}
}
2、FastJson
- 将对象转换为JSON字符串的步骤
- 导入jar包
- 在需要转换JSON字符串的位置编写如下代码
String json = JSON.toJSONString(要转换的对象);
案例:
Book b = BookDao.find();
String json=JSON.toJSONString(b);
System.out.println(json);
- 将JSON字符串转换为对象的步骤
- 导入jar包
- 在需要转换Java对象的位置 编写如下代码
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰
\",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
Book book = JSON.parseObject(json, Book.class);
System.out.println(book);
- 举例
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.List;
public class demo2 {
//测试FastJson
public static void main(String[] args) {
Student student = new Student("张三", 18);
//将对象转换为json
String s = JSON.toJSONString(student);
System.out.println(s); //{"age":18,"name":"张三"}
//将json字符串转换为对象
Student s2 = JSON.parseObject("{\"age\":18,\"name\":\"张三\"}", Student.class);
System.out.println(s2.getName()); //张三
//将json数据(含数组)转化为HashMap集合
//json数据:{"name":"小李","age":18,"page":["第一页","第二页","第三页","第四页"]}
String text2 = "{\"name\":\"小李\",\"age\":18,\"page\":[\"第一页\",\"第二页\",\"第三页\",\"第四页\"]}";
HashMap hashMap = JSON.parseObject(text2, HashMap.class);
System.out.println(hashMap.get("page")); //["第一页","第二页","第三页","第四页"]
System.out.println(hashMap.get("page").getClass()); //class com.alibaba.fastjson.JSONArray
//将json数据(数组)转化为List集合
//数组:["你叉叉","穷哈哈","哈利波特骑着扫帚飞"]
String text3 = "[\"你叉叉\",\"穷哈哈\",\"哈利波特骑着扫帚飞\"]";
List<String> strings = JSON.parseArray(text3, String.class);
System.out.println(strings); //[你叉叉, 穷哈哈, 哈利波特骑着扫帚飞]
System.out.println(strings.getClass()); //class java.util.ArrayList
}
}