-
JSON
简介: JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。
-
首先JSON具有三种表现格式
-
对象格式
通过与其他对象格式对比举例说明:
抛出问题 有一个类:书 属性:书名和简介,如何定义?
java:
class Book{
private String name;
private String info;
get/set...
}
Book b = new Book();
b.setName(“金苹果”);
b.setInfo(“种苹果”);
...
js:
var b = new Object();
b.name = "金苹果";
b.info = "种苹果";
XML:
<book>
<name>金苹果</name>
<info>种苹果</info>
</book>
JSON:
{
"name":"金苹果",
"info":"种苹果"
}
JSON中一个对象, 由一个大括号表示.括号中 描述对象的属性 . 通过键值对来描述对象的属性(可以理解为, 大括号中, 包含的是一个个的键值对.)
格式:键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)
键值对的值, 可以是JS中的任意类型的数据。
-
数组格式
1.属性的值是一一对应的,一个属性的值可以包含多个信息(用[ ]括起包含的信息,可以理解为数组)
2:方括号中每个数据以json对象形式出现
3:每两个数据以逗号分隔(最后一个无需逗号)
遵守上面3点,便可形成一个json对象数组(及一个数组中,存储了多个json对象)
理解了上面两种基本的形式,我们就可以得出其他的数据形式,例如下面这个:
{
"社团":"话剧社",
"部门":[
{"ID": 1001, "name": "调研部", "info": "申请场地"},
{"ID": 1002, "name": "外联部", "info": "拉赞助"},
{"ID": 1003, "name": "宣传部", "age": "制作海报"}],
"社团成立年限":"11年"
}
-
字符串格式
JSON字符串也是在平时开发中使用较多的,json字符串应满足以下条件:
1:它必须是一个字符串,由" "或者' '包裹数据,支持字符串的各种操作。
2:里面的数据格式应该要满足其中一个格式,可以是json对象,也可以是json对象数组或者是两种基本形式的组合变形。
在JSON格式中可以与对象互相嵌套 [元素1,元素2...]
举个例子:
{
"name":"王路飞",
"age":22,
"friends":["刘索隆","三治","娜美","乌索普",{
"name":"弗兰奇",
"info":"是个改造人,拥有很炫酷的机甲"
}],
"opponents":{
"name":"黑胡子",
"info":"四皇"
}
}
正是因为有了这种数组跟对象互相嵌套的的格式,使得JSON的数据具有很高的括展性,但是有时候JSON数据会非常的多,程序员看的眼花缭乱的,很难用肉眼分清楚它的内部数据层次结构,这时候我们需要借助JSON校验格式化工具,为了下面方便对JSON数据格式进行我在这里提供一个网址https://www.sojson.com/simple_json.html
提供一个JSON格式的数据
{
"code": "10000",
"charge": false,
"remain": 0,
"msg": "查询成功",
"result": {
"garbage_info": [
{
"cate_name": "湿垃圾",
"city_id": "310000",
"city_name": "上海市",
"confidence": 0.780099213,
"garbage_name": "坚果炒货",
"ps": "投放建议:容器与外包装为可回收物"
}
],
"message": "success",
"status": 0
}
}
然后对上面的数据进行校验的,当我们少打一个“}”时,右上边会有错误信息,下边的黑方格是出错的地方,改正之后,数据格数的层次会在右边按层级显示。(这里只举了一个错误发生的案例)
-
JSON做什么?
将Java中的对象 快速的转换为 JSON格式的字符串。
将JSON格式的字符串, 转换为Java的对象。
JSON与对象之间实现数据转化有两种方式,一种是谷歌公司提供的的Gson,一种是阿里公司提供的FastJson,下面对两种方法的使用分别展开介绍。
-
Gson
-
将对象转换为JSON字符串
转换JSON字符串的步骤:
首先去网上下载好需要导入的jar包 (可以去官网下载最新版本,也可以在csdn上收索下载链接)
1. 引入JAR包--gson-2.8.6.jar
2. 在需要转换JSON字符串的位置编写如下代码即可: String json = new Gson().toJSON(要转换的对象);(这个地方用的匿名内部类,主要就是节省内存空间,但是匿名内部类调用方法只能使用一次,当程序员想要再次通过此类调用方法时,要重新声明或者再次使用匿名内部类)
也可以走常规路径:
Gson gson = new Gson();
//2.创建图书对象
Book book = new Book("1001","数据库系统原理","数据库入门必修课程");
//3.将Book对象转换成JSON
String s = gson.toJson(book);
案例:
public class Book {
private String id;//编号
private String name;//书名
private String info;//书的介绍
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Book() {
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
import com.google.gson.Gson;
public class TestJSON {
public static void main(String[] args) {
//1.创建Gson对象
Gson gson = new Gson();
//2.创建图书对象
Book book = new Book("1001","数据库系统原理","数据库入门必修课程");
//3.将Book对象转换成JSON
String s = gson.toJson(book);
System.out.println(s);
}
}
输出结果:
-
将JSON字符串转换为对象
引入JAR包后,在需要转换Java对象的位置, 编写如下代码: 对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例:
import com.google.gson.Gson;
public class TestJSON {
public static void main(String[] args) {
//1.创建Gson对象
Gson gson = new Gson();
//{"id":"1001","name":"数据库系统原理","info":"数据库入门必修课程"}
Book book = gson.fromJson("{\"id\":\"1001\",\"name\":\"数据库系统原理\",\"info\":\"数据库入门必修课程\"}", Book.class);
System.out.println(book.getId());
}
}
输出结果:
-
FastJson
-
将对象转换为JSON字符串
转换JSON字符串的步骤:
1. 引入JAR包-------fastjson-1.2.70.java
2. 在需要转换JSON字符串的位置编写如下代码即可: String json=JSON.toJSONString(要转换的对象);
-
将JSON字符串转换为对象
1. 引入JAR包-------fastjson-1.2.70.java
2. 在需要转换Java对象的位置, 编写如下代码:
对象类型 类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
数组类型 List<类型> list=JSON.parseArray(JSON字符串,类型.class);
案例:
public class Book {
private String id;//编号
private String name;//书名
private String info;//书的介绍
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Book() {
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
public class TestJSON {
public static void main(String[] args) {
System.out.println("--------fastJSON将对象转换成JOSN格式--------");
Book book = new Book("10002","网络安全","一本介绍网络运行规则的书");
//1.创建fastGson对象
String json= JSON.toJSONString(book);
System.out.println(json);
System.out.println("--------fastJSON将JOSN格式转换成对象--------");
String s="{\"id\":\"10002\",\"info\":\"一本介绍网络运行规则的书\",\"name\":\"网络安全\"}";
// StringEscapeUtils.unescapeJava(String data);
Book book1 = JSON.parseObject("{\"id\":\"10002\",\"info\":\"一本介绍网络运行规则的书\",\"name\":\"网络安全\"}", Book.class);
//json字符串与javaBean之间的转换可以使用 TypeReference<T> 这个类
Book book2 = JSON.parseObject(s,new TypeReference<Book>(){});
// 数组类型 List<类型> list=JSON.parseArray(JSON字符串,类型.class);
List<String> books = JSON.parseArray("[\"id\",\"10002\",\"info\",\"一本介绍网络运行规则的书\",\"name\",\"网络安全\"]",String.class);
System.out.println(book1);
book2.setName("HTML语法编程");
System.out.println(book2.getName());
System.out.println("book2修改后的变成:"+book2);
for (String b: books) {
System.out.print(b+"\t");
}
}
}
输出结果:
用数组类型时注意三个情况:
1.JSON.parseArray(JSON字符串,类型.class);中的字符串不再用“ { }”进行封装,而是用"[ ]"。
报错:
2.SON.parseArray(JSON字符串,类型.class);中字符串不再是键值对的形式,而是变成全部用“ , ”隔开。
将上面JSON.parseArray("[\"id\",\"10002\",\"info\",\"一本介绍网络运行规则的书\",\"name\",\"网络安全\"]",String.class);中字符串中从开始位置数到七位,然后将第七位的内容改成“ : ”,也就是\"id\":\"10002\",键值对的形式表示,会出第七个位置数据不合理的错误。
报错:
3.注意List传递的类型不要设置为类,最好使用String。
报错:
上一篇:XML的使用
下面推一篇XML和JSON的区别比较: