JSON学习
最近学习中了解到一个新的内容:JSON,学习之后有了一点小的概念,写下这篇博客,帮自己加深理解。纯属自己个人的理解,如果有错,希望大家及时指出,多多包涵。
文章目录
首先,我们要了解一样东西,要知道它是什么,用来干嘛的。
什么是JSON
以下是JSON的官方介绍:
来自JSON中文网:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。
它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。
JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON基于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。
通俗地讲,它就是一种数据的表达方式,我们用这样一种格式来将我们的数据表达出来。
JSON用来做什么?
通常呢,JSON用于服务器和客户端的数据交换。
JSON的语法
- JSON数据由 键(key)/ 值(value) 来描述,并且用逗号 , 来分割。
- 一个大括号代表一个完整的对象,拥有多个键值对。
- 中括号用来保存数组,数组内多个对象之间用逗号分割。
var json = {
"class1":[
{"name":"张三","id":"2021111"},
{"name":"李四","id":"2021222"},
{"name":"王五","id":"2021333"}
]
}
这里面 class1 是一个键,它的值是后面的中括号保存的数组。
数组内有3个对象,也都是键值对的形式。
为了规范,避免出错,键和值都要用双引号。
JSON文件中不要加注释,会报错。
这里有JSON中文网提供的在线编辑工具,可以自行尝试。
尝试一下
1.我们新建一个web项目。
我用的是Intellij IDEA,个人感觉比eclipse好用,用户体验贼佳。
具体操作我就不贴了。
2.创建一个json文件,后缀要是.json。
这里大括号内是一个完整的对象,对象与对象间保存的数据可以不同。我们给张三一个班长职务。
3.创建好之后我们就要使用它。
JSON原名 JavaScript Object Notation 。下面我们就用javaScript来操作它。创建一个html文件,编写javaScript代码。
<!DOCTYPE html>
<html>
<head>
<title>JSON</title>
<meta charset="utf-8">
<!-- 引入jquery文件来处理json-->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
$.ajax({
type:"get",
url: "class.json",
dataType:"json",
success:function(data) {
//将json对象转换为字符串
$("#json").html(JSON.stringify(data));
//遍历data,输出json
$.each(data,function(index,obj){
let job =function (){
if(obj["job"]!=null){
return "<p>职务:" + obj["job"] + "</p>";
}else
return "";
};
$("#json1").append(
"<p>姓名:" + obj["name"] + "</p>" +
"<p>id:" + obj["id"] +"</p>" +
job()
);
})
},
error:function() {
alert("请求失败");
}
});
</script>
</head>
<body>
<h1>JSONTest</h1>
<p id="json"></p>
<div id="json1"></div>
</body>
</html>
结果:
上面我们用了 JSON.stringify() 将json对象转化为字符串,那么相对应的,也有 JSON.parse 将字符串转化为json对象。
注意:定义字符串时,要用 \ 转义,不然会冲突,比如:
var class="{\"name\":\"张三\"}";
json本身是一个对象,除了最上面直接定义初始化的方法之外,我们还可以以对象的方式对其初始化,比如:
var class1={};
class1.name="张三";
class1.id="2021111";
//数组
var teacher={};
teacher.name="李老师";
teacher.id="2021777";
var school={};
school.name="理工";
school.id="555";
var dep=[teacher,school];
JSON交互
上面我们说JSON是用于数据存储与传输的一种格式,常用于服务器与客户端的数据交互,下面我们就来讲讲JSON与JAVA。
我们说JSON一开始是为javascript设计使用的,后来发现,这东西很好用,渐渐地,其他语言也开始使用JSON。于是,java工程师便开发了java的JSON工具包,用与JSON与java对象的相互转换。
Fastjson
Fastjson是比较常用的json工具,其他还有Gson等。
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
引入jar包或者注入依赖就能使用:
jar包:https://github.com/alibaba/fastjson/releases
Maven:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
Fastjson尝试
1.在项目上新建一个实体类。
public class student {
private int id;
@JSONField(name="姓名")
private String sname;
@JSONField(name="职务")
private String job;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
上面实体类中有一个注解 **@JSONField(name=“姓名”)**注解是啥我就不说了,通过注解,能极大的方便我们对json对象的操作,除了上面这个,还有其他注解,大家自行了解。
@JSONField(name=“xx”) 这个注解能修改得到的json对应键的名字。比如上例,如不加注解,得到的结果为
{“id”:2021111,“job”:“班长”,“sname”:“张三”}
加上注解后:
{“id”:2021111,“姓名”:“张三”,“职务”:“班长”}
sname 被改成了 姓名,job 被改成了 职务
这里姓名和职务两个键的位置调换了是因为fastjson封装json时会默认按属性名称由a到z排序。
2.接着创建测试类
import com.alibaba.fastjson.JSON;
public class test1 {
public static void main(String[] args) {
// 初始化,因为之前没创建构造方法,所以一个一个添加
student s = new student();
s.setId(2021111);
s.setSname("张三");
s.setJob("班长");
// fastjson中提供了JSON对象来完成对象与字符串的转换
// java对象转json
String json = JSON.toJSONString(s);
System.out.println(json);
// json转java对象
student stu = JSON.parseObject(json,student.class);
System.out.println(stu.getSname());
}
}
结果:
Fastjson 数组对象
上面我们转换的是单个对象,下面来看数组。
1.新建测试类
public class test2 {
public static void main(String[] args) {
// 一个班50人,职务就不设了
List class1 = new ArrayList();
for(int i = 1;i<=50;i++){
student stu = new student();
stu.setId(2021 + i);
stu.setSname("学生" + i);
class1.add(stu);
}
// 转换,还是用这个方法
String json = JSON.toJSONString(class1);
System.out.println(json);
// json转集合
List<student> students = JSON.parseArray(json, student.class);
for(student s : students){
System.out.print(s.getSname() + " ");
}
}
}
结果太长了,不贴了。
json工具包可以把对象以及对象的集合转换为字符串的形式,常用于Ajax。
共勉,希望每个人的努力都能得到回报。