JSON解析初学
前言
这篇博客只为自学复习,如果大家有想要学习JSON的可以把此篇博客当成初学难度,当成学习的跳板,这里建议大家,在学习此篇JSON解析后,对JSON有了一定的了解后,可以转到这两处进行更进一步的学习,逆境都是为了学习,我这篇实力有限,尽量展示,如有不好的,大家可以评论留言
链接:超详细JSON解析步骤
链接:JSON三种数据解析方法
JSON简介
- JAVAScript Object Notation是一种轻量级的数据交换格式
- 具有良好的可读和便于快速编写的特性。
- 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
- JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
- JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强。
Java与JSON
那我们在每次学习新的知识的时候,就要对自己说,我们不光要学的是知识,还要有实践,==毕竟实践出真知,实践是检验真理的唯一标准。==所以我们学习JSON到底要干什么?
- 将Java中的对象 快速的转换为 JSON格式的字符串。
- 将JSON格式的字符串, 转换为Java的对象。
总所周知,JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
JSON语法
JSON 语法是 JavaScript 语法的子集。
JSON 语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
JSON 名称/值对
JSON 数据的书写格式是:
key : value
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"name" : "法外狂徒张三"
这很容易理解,等价于这条 JavaScript 语句:
name = "法内狂徒罗翔"
开玩笑的,憋当真啊,我还是很敬重我们的罗老师的,毕竟他教会了我很多可以"不违法",但道德
不提倡的各种紧急避险,我很爱罗老师。
JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
JSON 数字
JSON 数字可以是整型或者浮点型:
{ "age":30 }
JSON 对象
JSON 对象使用在大括号{}
中书写。
对象可以包含多个 key/value(键/值)对。
key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
key 和 value 中使用冒号(:)分割。
每个 key/value 对使用逗号(,)分割。
{key1 : value1, key2 : value2, … keyN : valueN }
对象可以包含多个名称/值对:
{ "name":"一本好书" ,"introduce":"金色的瓶子中有一朵梅花" }
这一点也容易理解,与这条 JavaScript 语句等价:
name = "一本好书"
introduce= "金色的瓶子中有一朵梅花"
JSON 数组
SON 数组在中括号[]
中书写。
JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期,及 undefined。
数组可包含多个对象:
[
{ key1 : value1-1 , key2:value1-2 },
{ key1 : value2-1 , key2:value2-2 },
{ key1 : value3-1 , key2:value3-2 },
...
{ keyN : valueN-1 , keyN:valueN-2 },
]
这段代码就是两者进行了简单的嵌套
{
"sites": [
{ "name":"一本好书" ,"introduce":"金色的瓶子中有一朵梅花"},
{ "name":"也是好书" ,"introduce":"品花宝鉴" },
{ "name":"还是好书" ,"introduce":"隔帘花影"},
{"name":"真是好书" ,"introduce":"杏花天"}
]
}
在上面的例子中,对象 sites 是包含三个对象的数组。每个对象代表一条关于某个历史好书(name、introduce)的记录。
JSON 布尔值
JSON 布尔值可以是 true 或者 false:
{ "flag":true }
JSON null
JSON 可以设置 null 值:
{ "runoob":null }
JSON 使用 JavaScript 语法
因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON。
通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值:
var sites = [
{ "name":"一本好书" ,"introduce":"金色的瓶子中有一朵梅花"},
{ "name":"也是好书" ,"introduce":"品花宝鉴" },
{ "name":"还是好书" ,"introduce":"隔帘花影"},
{"name":"真是好书" ,"introduce":"杏花天"}
];
JSON vs XML
那其实我在刚刚也说了,JSON是在2005年左右才正式成为主流,那之前的主流就是XML。那就是到了现在其实在有些大的公司的老程序员也还是有在使用XML的。
那不管他们是如何,我们的学习目的是不变的。我们在学习JSON的时候总是会不可避免的接触学习一下XML。
JSON 和 XML 都用于接收 web 服务端的数据。
JSON 和 XML在写法上有所不同,如下所示:
JSON 实例:
{
"sites": [
{ "name":"一本好书" ,"introduce":"金色的瓶子中有一朵梅花"},
{ "name":"也是好书" ,"introduce":"品花宝鉴" },
{ "name":"还是好书" ,"introduce":"隔帘花影"},
{"name":"真是好书" ,"introduce":"杏花天"}
]
}
XML 实例
<sites>
<site>
<name>一本好书</name> <introduce>金色的瓶子中有一朵梅花</introduce>
</site>
<site>
<name>也是好书</name> <introduce>品花宝鉴</introduce>
</site>
<site>
<name>还是好书</name> <introduce>隔帘花影</introduce>
</site>
<site>
<name>真是好书</name> <introduce>杏花天</introduce>
</site>
</sites>
JSON 与 XML 的相同之处:
- JSON 和 XML 数据都是 “自我描述” ,都易于理解。
- JSON 和 XML 数据都是有层次的结构
- JSON 和 XML 数据可以被大多数编程语言使用
JSON 与 XML 的不同之处:
- JSON 不需要结束标签
- JSON 更加简短
- JSON 读写速度更快
- JSON 可以使用数组
最大的不同是:XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。
- JSON.parse():将一个 JSON 字符串转换为 JavaScript 对象。
- JSON.stringify(): 于将 JavaScript 值转换为 JSON 字符串。
为什么 JSON 比 XML 更好?
XML 比 JSON 更难解析。
JSON 可以直接使用现有的 JavaScript 对象解析。
针对 AJAX 应用,JSON 比 XML 数据加载更快,而且更简单:
使用 XML
- 获取 XML 文档
- 使用 XML DOM 迭代循环文档
- 接数据解析出来复制给变量
使用 JSON
- 获取 JSON 字符串
- JSON.Parse 解析 JSON 字符串
Gson解析
Gson是谷歌官方推出的支持 JSON -- Java Object
相互转换的 Java序列化/反序列化
库。GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发。在这里,我们主要讲解的是利用GSON来操作java对象和json数据之间的相互转换。
好,在开始正题之前我为大家提供两个jar包,来更好的使用Gson与FastJson(之后会讲)。
大家可以在Module中创建一个lib的Directory来存放我们的jar包,当然需要导入我们的本地Librarary。
我们可以直接在下载好jar后复制到lib下,然直接这样
Add as Library就可以了。那这两个jar包,我们可以直接去官网上找都是开源的或者我这里有链接,应该是可以。
gson下载然后找DownLoad就下载就好了
fastjson下载地址:含历史版本和最新版本
这也算是练习一下导包,以后说不定经常遇到。
那接下来的案例源码会比较简单,只是为了学习,不要过于注重代码量,逻辑。
对了,我们在编写的勤勉需要一个JavaBeans的Book类来支持调用。
package com.java.demo2;
import java.util.Objects;
/**
* @Author: King-lby
*/
public class Book {
private String id;
private String name;
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
public Book() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) &&
Objects.equals(name, book.name) &&
Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, 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;
}
private String info;
}
最常规的JavaBean了,构造方法,setter、getter、toString等等都有。
将对象转换为JSON字符串
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
/**
* @Author: King-lby
*/
public class Demo1 {
/**
* Gson
* @param args
*/
public static void main(String[] args) {
//将对象转换为JSON字符串
/* //1. 创建Gson对象
Gson g = new Gson();
//2. 转换
Book b = new Book("100","金苹果","种植苹果真辛苦");
String s = g.toJson(b);
System.out.println(s);*/
//如果只使用一次,可以转换为匿名对象
Book b = new Book("100","金苹果","种植苹果真辛苦");
String s = new Gson().toJson(b);
System.out.println(s);
}
}
运行结果:
将JSON字符串转换为对象
- 引入JAR包
- 在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
/**
* @Author: King-lby
*/
public class Demo2 {
/**
* Gson
* @param args
*/
public static void main(String[] args) {
//将JSON字符串转换为对象
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换
Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", Book.class);
System.out.println(b);
//如果只使用一次,可以转换为匿名对象,可以自行探索。
}
}
运行结果:
将JSON字符串转换为数组
//搞后端开发的兄弟会大量频繁的使用JSON
/**
* @Author: King-lby
*/
public class Demo3 {
/**
* Gson
* @param args
*/
public static void main(String[] args) {
//将JSON字符串转换为数组
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦","page":["锄禾日当午","汗滴禾下土","呵呵呵呵呵"]}
HashMap data = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"呵呵呵呵呵\"]}", HashMap.class);
System.out.println(data.get("page").getClass());
System.out.println(data.get("page"));//数组会转换成ArrayList集合
/* List page = (List) data.get("page");
System.out.println(page.get(1));*/
}
}
FastJson
将对象转换为JSON字符串
那我们的FastJson是由我们马爸爸的阿里研制的,顶。
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json=JSON.toJSONString(要转换的对象);
/**
* @Author: King-lby
*/
public class Demo4 {
public static void main(String[] args) {
//将对象转换为JSON字符串
Book book = new Book("1002","唐诗三百首","床前明月光,疑是地上霜。举头望明月,低头思故乡");
//1. 转换
String json = JSON.toJSONString(book);
System.out.println(json);
}
}
运行结果:
将JSON字符串转换为对象
- 引入JAR包
- 在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
/**
* @Author: King-lby
*/
public class Demo5 {
//将JSON字符串转换为对象
public static void main(String[] args) {
//1. 转换: {"id":"1002","info":"床前明月光,疑是地上霜。举头望明月,低头思故乡","name":"唐诗三百首"}
Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,疑是地上霜。举头望明月,低头思故乡\",\"name\":\"唐诗三百首\"}", Book.class);
System.out.println(book.getId());//获取id
System.out.println(book.getInfo());//获取info
System.out.println(book.getName());//获取name
}
}
运行结果:
将JSON字符串转换为数组
/**
* @Author: King-lby
*/
public class Demo6 {
//将JSON字符串转换为数组
public static void main(String[] args) {
//1. 转换 : ["一二三","二三四","三四五"]
List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]",String.class);
System.out.println(strings.get(1));//下标
}
}
运行结果:
总结
这次对于JSON的解析只是最简单的案例源码,如果大家想要更深一步学习,可以直接问度娘,搜索Json
,会出现各种Json在线解析,然后大家要找对应的Json格式源码可以搜索:api数据接口
,随便点进去一个,找个免费的,往下划拉,会有Json格式的源码。
当然有可能不好搜,这里提供一个API数据接口网站,我们就找天气预报得了。
同样的,我们可以直接点击蓝色的JSON在线格式化工具
这里就是结果显示,还是很不错的。
好了,大家可以自行探索了。