前言
首先大家要知道JSON是一种轻量级的数据交换格式,类似与之前的XML,那么我们学习过了XML了为什么还要学习JSON呢?是因为JSON太过于火热使得XML被人淘汰了哈哈哈。
往期好文推荐: 【EL与JSTL表达式】学习JSP之后,这是你不得不知道的技术
直接使得XML被淘汰了,那么这个JSON的重要性不言而喻了,我们正式开始学习!
初识JSON
JSON:全称为JavaScript Object Notation(JavaScript 对象表示法),是轻量级的文本数据交换格式。
JSON 是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析。这也是JSON能取代XML的原因之一。
JSON语法规则
JSON是一种格式,那么它的核心就是它自己的语法规则了。
JSON语法格式:
(1)数据由键(key)/值(value)描述,由逗号分隔。
(2)大括号代表一个完整对象,可拥有多个键值对。
(3)中括号保存数组,多个对象之间使用逗号分隔。
如下就是一个使用JSON语法构成的数据:
{ "sites":[ {"name" : "CSDN", "url" : "www.csdn.com"}, {"name" : "百度", "url" : "www.baidu.com"} ] }
创建JSON文件
我们创建一个JSON也是非常简单的,直接右击项目的源码目录,选择创建File(文件)即可,最后把后缀名改为.json即可。
之后进行编写即可如下:
[{"empno": 7369,"ename": "小明","job": "软件工程师","hiredate": "2017-04-12","salary": 13000,"dname": "研发部"}, {"empno": 7499,"ename": "王乐","job": "算法工程师","hiredate": "2017-05-12","salary": 19000,"dname": "研发部","customers": [{"cname": "秋冬"},{"cname": "傻狗"}]}]
写完之后可能有点长,我们给他进行格式化:
右击当前页面找到Source,然后在Source中找到Format点击即可。
就会发现页面格式变为:
除此之外我们还可以按快捷键来进行格式化:Ctrl + Shift + F
JSON与Java Script交互
之前就说过了JSON的全称为JavaScript Object Notation(JavaScript 对象表示法),这里有JavaScript,其实最早开始JSON就是专门为JavaScript来提供服务的,但是后来太好用了所以就慢慢对所有语言都可用了。
这里得说一下JSON是独立于语言的。
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
Java Script访问JSON
那么我们该如何使用JavaScript来访问JSON呢?
因为JSON是使用Javascript语法来描述数据对象的,所以JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。
所以JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。
接下来我们直接在HTML页面里,写一个JavaScript 代码块,在JavaScript 代码块里面来创建JSON数据对象,并对其进行输出。
Insert title here var json = [ { "empno": 7369, "ename": "小明", "job": "软件工程师", "hiredate": "2017-04-12", "salary": 13000, "dname": "研发部" }, { "empno": 7499, "ename": "王乐", "job": "算法工程师", "hiredate": "2017-05-12", "salary": 19000, "dname": "研发部", "customers": [ { "cname": "秋冬" }, { "cname": "大力" } ] } ]; //在瀏覽器控制臺對json内容進行輸出 console.log(json); //在瀏覽器頁面進行輸出 for(var i = 0; i < json.length; i ++) { var emp = json[i]; document.write(" ") document.write(emp.empno); document.write("," + emp.ename); document.write("," + emp.job); document.write("," + emp.salary); document.write("," + emp.dname); document.write("") //因为customers属性不是公有的,所以要先判断在进行输出 if(emp.customers != null) { document.write(" --") for(var j = 0; j < emp.customers.length; j++) { document.write(emp.customers[j].cname + ","); } document.write("") } }
我们在代码中分别先创建了JSON数据对象,然后对其内容分别在浏览器控制台与页面进行输出。接下来我们看一看输出效果。
JS中将字符串转换为JSON
在实际应用场景中我们会经常需要进行把字符串转化为JSON格式的数据或者是把JSON转化为字符串进行保存。
我们先来看将字符串转化为JSON。
使用JSON.parse()方法将字符串转换为JSON对象
其实就是这么简单的,我们继续写一个案例进行演示。
字符串转JSON
//原始字符串不能写错,需要与标准JSON格式相同才能进行转换 var str = "{\"class_name\":\"五年级二班\"}"; var json = JSON.parse(str); console.log(json); console.log(str); document.write(json.class_name);
在浏览器页面中的输出:
但是这里要注意,不是所有的字符串都能转化为JOSN对象的,这里的字符串要求是格式是JSON格式的字符串,要符合JSON语法的。
JS中将JSON对象转化为字符串
使用JSON.stringify()方法将JSON对象转换为字符串
其实就是这么简单的,我们继续写一个案例进行演示。
JSON转字符串
var json = {"class_name" : "三年级五班"}; var str = JSON.stringify(json); console.info(json); console.info(str)
;
在浏览器进行输出
在JS中创建JSON对象
其实我们在js中创建JSON对象还可以这样:
JSON转字符串
//创建json的新方式,当作对象一样! var json1 = {} json1.class_name = "六年级八班"; json1.teacher = "大力"; console.info(json1);
输出:
JSON与Java交互
之前提到了JSON是脱离与语言的,我们Java也能与JSON进行交互。接下来就来看看它们是怎么要进行交互的。
环境准备
Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。
下面是几个常用的 JSON 解析类库:
(1)Gson: 谷歌开发的 JSON 库,功能十分全面
(2)FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
(3) Jackson:社区十分活跃且更新速度很快。
我们这里选用国产的JSON解析库FastJson。
我们首先安装FastJson解析库,在网上下载FastJson的jar包之后我们只需要把他复制到Web应用的WEB-INF目录底下的lib目录中去,就可以使用了。
FastJSON对象序列化与反序列化
序列化与反序列化其实就是,Java对象与JSON对象之间的转换.
(1)使用JSON.toJSONString(Java对象)将Java对象转化为JSON字符串。
(2)使用 JSON.parseObject(JSON对象,要转化为的Java类)将JSON对象转化为Java对象。
代码演示:
我们先创建一个Java类用来创建原始数据。
public class Employee { private Integer empno; private String ename; private String job; private Date hdate; private Float salary; private String dname; public Employee() { } public Employee(Integer empno, String ename, String job, Float salary, String dname) { super(); this.empno = empno; this.ename = ename; this.job = job; this.salary = salary; this.dname = dname; } public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Date getHdate() { return hdate; } public void setHdate(Date hdate) { this.hdate = hdate; } public Float getSalary() { return salary; } public void setSalary(Float salary) { this.salary = salary; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } } 然后创建Java类对象进行转化: public class FastJsonSample1 { public static void main(String[] arge) { Employee employee; employee = new Employee(1101, "大力", "经理", 10000f, "市场部"); Calendar c = Calendar.getInstance(); c.set(2019,0,30,0,0,0); employee.setHdate(c.getTime()); //FastJSON中提供了JSON对象,完成对象与JSON字符串的相互转换 String json = JSON.toJSONString(employee); System.out.println(json); //JSON对象转换为Java类对象 Employee emp = JSON.parseObject(json,Employee.class); System.out.println(emp.getEname()); } }
输出:
我们可以看到转化输出都非常成功但是这个日期与我们设置的并不相同。
其实这里的日期默认为时间戳-从1970到设置日期的毫秒数,我们可以使用注解来解决这个问题。
我们在创建类的日期属性上面增加注解设置格式:
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
再来看输出:
正常输出了。
FastJSON对象数组序列化与反序列化
刚才是单个 FastJSON对象序列化与反序列化,但是在平时的真实应用场景中,往往是很多的JSON对象与Java对象之间进行转换,或者是很多的Java对象与JSON对象进行转化的。
那么我们又该如何让进行转化呢?
(1)依然使用JSON.toJSONString(Java对象)将Java对象转化为JSON字符串。
(2)使用 JSON.parseArray(JSON对象,要转化为的Java类)将JSON对象转化为Java对象。
代码演示:
public class FastJsonSample2 { public static void main(String[] arge) { List emplist = new ArrayList(); //使用循环创建对象组 for(int i = 0; i < 50; i ++) { Employee employee = new Employee(); employee.setEmpno(1012 + i); employee.setEname("员工" + i); emplist.add(employee); } //可以把数组,集合,List转换为JSON数组 String json = JSON.toJSONString(emplist); System.out.println(json); //反序列化,将JSON转换为Java对象 List emps = JSON.parseArray(json, Employee.class); for(Employee e : emps) { System.out.println(e.getEname() + ":" + e.getEmpno()); } } }
输出:
结语
JSON代替了XML,成为了当下使用最广泛的一门技术之一。我们应该对其在学习阶段好好练习掌握,以便在工作中熟练运用。