JSON学习

一、JSON

1.1 简介

JSON:JavaScript Object Notation是一种表示对象的方式

基于JavaScript语言的轻量级的数据交换格式;(即:用来传输数据的一种格式)

现在传输数据的方式更多是采用json的格式,渐渐代替了XML

1.2 JSON的数据表示

JSON采用名值对的方式来表示一个对象的信息

符号描述示例
{}表示对象{name : ‘书名1’ , price:100}
[{},{},{}]表示对象数组[ {name : ‘书名1’ , price:100} , {name : ‘书名2’ , price:200} ]

注意:

  1. JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注

  2. 键和值之间用 : 隔开

  3. 键值对之间用 , 隔开

  4. 支持无限层嵌套

    ps:{name : ‘Java从入门到精通’ , price:100 , author:{name:‘吴彦祖’ , info:‘从事java20年’}}

  5. ‘’ 或 “” 都可以表示字符串

二、序列化和反序列化

序列化:指的是将Java对象转换为JSON字符串的过程,即 Java对象 → JSON字符串

反序列化:指的是将JSON字符串转换为Java对象的过程,即 JSON字符串 → Java对象

三、浏览器中处理JSON

3.1 JSON字符串 → 对象

使用parse函数解析JSON格式字符串

parse函数注意事项(坑):

  1. 字符串的数据格式:所有属性必须用双引号引住,因为使用JSON.parse需严格遵守JSON规范。
  2. 单引号与双引号 :使用单引号嵌套双引号的方式 ’ {“name” : “Java从入门到精通” , “price”:“100”} ’

总结:

使用JSON.parse()来解析JSON字符串,需要注意的是被转化的字符串里面的属性要使用引号,并且总体是单引号套双引号的方式,太麻烦了。 如果使用eval() 就可以忽略上述两点需要注意的地方

<script type="text/javascript">		//JSON字符串var jsonStr = '{"name" : "Java从入门到精通" , "price":"100"}';//JSON对象		var jsonObj = JSON.parse(jsonStr);//解析JSON字符串//获取数据	console.log(jsonObj.name);console.log(jsonObj.price);
</script>

使用eval函数解析JSON格式字符串

eval(str):将函数的参数作为JavaScript代码去执行

eval函数注意事项(坑):

​ 使用()包裹JSON字符串

​ “({name:‘Java从入门到精通’,price:100 , author:{name:‘吴彦祖’ , info:‘从事java20年’}})”

原因:

​ eval本身的问题。 由于json是以”{}”的方式来开始以及结束的。在JavaScript中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为代码来执行。

<script type="text/javascript">//JSON字符串var jsonStr = "({name:'Java从入门到精通',price:100,author:{name:'吴彦祖' , info:'从事java20年'}})";//解析成JSON对象var jsonObj = eval(jsonStr);//获取数据console.log(jsonObj.name);console.log(jsonObj.price);console.log(jsonObj.author.name);console.log(jsonObj.author.info);
</script>
<script type="text/javascript">//JSON字符串var jsonStr1 = "([{name:'Java从入门到精通',price:100,author:{name:'吴彦祖' , info:'从事java20年'}},		{name:'论演技的重要性',price:30,author:{name:'麻生希' , info:'从事电影事业13年'}}])";//解析成JSON对象数组var jsonObj = eval(jsonStr1);//遍历获取数据for(var i = 0;i<jsonObj.length;i++){console.log(jsonObj[i].name);console.log(jsonObj[i].price);console.log(jsonObj[i].author.name);console.log(jsonObj[i].author.info);}
</script>
3.2 对象 → JSON字符串
<script type="text/javascript">	//对象var book = new Object();book.name = "Java从入门到精通";book.price = 100;//将对象转换为JSON字符串var jsonStr = JSON.stringify(book);//打印数据console.log(jsonStr);
</script>

四、Java中处理JSON

如果使用逻辑或Java原生解析类去解析JSON是非常麻烦的

项目中大多数会使用FastJSON和Jackson来操作JSON

五、FastJSON

5.1 简介

FastJson:阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,使用此框架必须在项目中导入框架包(fastjson-1.1.33.jar)

FastJson对于json格式字符串的解析主要用到了下面三个类:

  1. JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
  2. JSONObject:FastJSON提供的json对象
  3. JSONArray:FastJSON提供json数组对象
5.2 特点
  1. FastJson速度快,无论序列化和反序列化,都是当之无愧的fast
  2. 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  3. 零依赖(没有依赖其它任何类库)
5.3 对象 → JSON字符串
public class FastJsonTest01 {@Testpublic void test01(){//对象->json对象Book book = new Book("Java从入门到精通",100);String jsonStr = JSON.tojsonStr(book);System.out.println(jsonStr);}@Testpublic void test02(){//对象->json对象(复杂版本)Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));String jsonStr = JSON.tojsonStr(book);System.out.println(jsonStr);}@Testpublic void test03(){//对象->json字符串(加过滤器)//匿名内部类PropertyFilter filter = new PropertyFilter(){public boolean apply(Object obj,String name,Object value){if(name.equalsIgnoreCase("price")){//忽略大小写比较return false;}return true;}};Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));String jsonStr=JSON.tojsonStr(book,filter);System.out.println(jsonStr);}
}
//书本类
public class Book {private String name;private double price;private Author author;public Book() {}public Book(String name, double price, Author author) {this.name = name;this.price = price;this.author = author;}public Book(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Author getAuthor() {return author;}public void setAuthor(Author author) {this.author = author;}@Overridepublic String toString() {return "Book[name=" + name + ", price=" + price + ", author=" + author + "]";}
}
//作者类
public class Author {private String name;private String info;public Author() {}public Author(String name, String info) {this.name = name;this.info = info;}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;}@Overridepublic String toString() {return "Author [name=" + name + ", info=" + info + "]";}
}
5.4 JSON字符串 → 对象
public class FastJsonTest02 {@Testpublic void test01(){//json字符串对象->对象String jsonStr = "{'name':'Java从入门到精通','price':100}";Book book = JSON.parseObject(jsonStr,Book.class);System.out.println(book);}@Testpublic void test02(){//复杂的json字符串->对象String jsonStr = "{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100}";Book book = JSON. parseObject(jsonStr, Book . class);System. out . println(book);}
}
5.5 数组或集合 → JSON字符串
public class FastJsonTest03 {Book book1 = new Book("Java从入门到精通", 100, new Author("吴彦祖","从事java20年"));Book book2 = new Book("论演技的重要性", 30, new Author("麻生希", "从事电影事业13年"));@Testpublic void test01(){//数组->json字符串Book[] books = {book1, book2};String jsonStr = JSON. tojsonStr(books);System.out.println(jsonStr);}@Testpublic void test02() {//List集合->json字符串ArrayList<Book> list = new ArrayList<Book>();list.add(book1);list.add(book2);String jsonStr = JSON.tojsonStr(list);System.out.println(jsonStr);}@Testpublic void test03() {//Map集合-〉json字符串HashMap<String, Book> map = new HashMap<String,Book>();map.put("001", book1);map.put("002", book2);String jsonStr = JSON.tojsonStr(map);System.out.println(jsonStr);}
}
5.6 JSON字符串 → 数组或集合
public class FastJsonTest04 {	@Testpublic void test01(){//json字符串->数组String jsonStr = "[{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100},{'author':{'info':'从事电影事业13年','name':'麻生希'},'name':'论演技的重要性','price':30}]";JSONArray parseArray = JSON.parseArray(jsonStr);for(int i = 0;i < parseArray.size();i++){	Book book = parseArray.getObject(i, Book.class);System.out.println(book);}}@Testpublic void test02(){//json字符串->List集合String jsonStr = "[{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100},{'author':{'info':'从事电影事业13年','name':'麻生希'},'name':'论演技的重要性','price':30}]";List<Book> list = JSON.parseArray(jsonStr,Book.class);for(Book book : list){System.out.println(book);}}@Testpublic void test03(){//json字符串->Map集合String jsonStr = "{'001':{'author':{'info':'从事java20年', 'name': '何老师'},"+ "'name':'Java从入门到精通','price':100}, '002':{'author':{'info':'"+"从事电影事业13年','name' :'麻生希'},'name':'论演技的重要性','price' :30}}";@SuppressWarnings("unchecked")Map<String,JSONObject> map = (Map<String, JSONObject>) JSON.parse(jsonStr);Set<Entry<String, JSONObject>> entrySet = map.entrySet();for(Entry<String, JSONObject> entry : entrySet){String key=entry.getKey();Book value = JSON.toJavaObject(entry.getValue(), Book.class);System.out.println(key + "--" + value);}}
}

六、Jackson

6.1 简介

Jackson框架是基于Java平台的一套数据处理工具

解析JSON,依赖jackon的三个核心类库:
jackson-core-2.9.8.jar

​ jackson-annotations-2.9.8.jar

​ jackson-databind-2.9.8.jar

6.2 特点

使用注解,让JSON解析更加灵活

6.3 对象、集合 → JSON字符串
public class Test01 {@Testpublic void test01() throws JsonProcessingException{//将对象转换为JSON字符串Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));//使用ObjectMapper来转化对象为JSON字符串ObjectMapper mapper = new ObjectMapper();// 配置mapper忽略空属性mapper.setSerializationInclusion(Include.NON_EMPTY);//将对象转换为JSON字符串String jsonStr = mapper.writeValueAsString(book);System.out.println(jsonStr);}@Testpublic void test02() throws JsonProcessingException{//将集合转换为JSON字符串Book book1 = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));Book book2 = new Book("论演技的重要性", 30, new Author("麻生希", "从事电影事业13年"));List<Book> list = new ArrayList<>();list.add(book1);list.add(book2);//使用ObjectMapper来转化对象为JSON字符串ObjectMapper mapper = new ObjectMapper();// 配置mapper忽略空属性mapper.setSerializationInclusion(Include.NON_EMPTY);//将对象转换为JSON字符串String jsonStr = mapper.writeValueAsString(list);System.out.println(jsonStr);}
}
6.4 JSON字符串 → 对象、集合
public class Test02 {@Testpublic void test01() throws IOException{//json字符串对象->对象String jsonStr = "{\"name\":\"Java从入门到精通\",\"price\":100.0,\"author\":{\"name\":\"吴彦祖\",\"info\":\"从事java20年\"}}";//ObjectMapper类用序列化与反序列化映射器ObjectMapper mapper = new ObjectMapper();//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Book book = mapper.readValue(jsonStr, Book.class);System.out.println(book);}@Testpublic void test02() throws IOException{//json字符串->数组String jsonStr = "[{\"author\":{\"info\":\"从事java20年\",\"name\":\"吴彦祖\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"从事电影事业13年\",\"name\":\"麻生希\"},\"name\":\"论演技的重要性\",\"price\":30}]";//ObjectMapper类用序列化与反序列化映射器ObjectMapper mapper = new ObjectMapper();//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);List<Book> list = mapper.readValue(jsonStr, new TypeReference<List<Book>>() {});for (Book book : list) {System.out.println(book);}}
}
6.5 Jackson注解
public class Test01 {@Testpublic void test01() throws JsonProcessingException{//将对象转换为JSON字符串Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));//ObjectMapper类用序列化与反序列化映射器ObjectMapper mapper = new ObjectMapper();// 配置mapper忽略空属性mapper.setSerializationInclusion(Include.NON_EMPTY);//将对象转换为JSON字符串String jsonStr = mapper.writeValueAsString(book);System.out.println(jsonStr);}@Testpublic void test02() throws IOException{//json字符串对象->对象String jsonStr = "{\"bookName\":\"Java从入门到精通\",\"price\":100.0,\"author\":{\"name\":\"吴彦祖\",\"info\":\"从事java20年\"}}";//ObjectMapper类用序列化与反序列化映射器ObjectMapper mapper = new ObjectMapper();//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Book book = mapper.readValue(jsonStr, Book.class);System.out.println(book);}
}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;public class Book {@JsonProperty("bookName")//java属性name序列化到JSON字段的名称为bookNameprivate String name;@JsonIgnore//在序列化与反序列化时,忽略price属性private double price;private Author author;@JsonCreator//指定JSON反序列化创建Book对象时调用此构造函数public Book() {}public Book(String name, double price,Author author) {System.out.println("aaa");this.name = name;this.price = price;this.author = author;}public Book(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Author getAuthor() {return author;}public void setAuthor(Author author) {this.author = author;}@Overridepublic String toString() {return "Book[name=" + name + ", price=" + price + ", author=" + author + "]";}
}

七、总结

  1. JSON 格式:
    • {} - 对象
    • [{},{},{}] - 数组
  2. JSON可以支持无限层嵌套
  3. 序列化和反序列化
    • 序列化:指的是将对象转换为JSON字符串的过程,即 对象 → JSON字符串
    • 反序列化:指的是将JSON字符串转换为对象的过程,即 JSON字符串 → 对象
  4. 浏览器中处理JSON
    • parse():使用单引号嵌套双引号的方式
    • eval():使用()包裹JSON字符串
  5. Java中处理JSON:使用FastJSON和Jackson框架

八、作业

  1. 创建学生类(Student),属性有String name,int age,char sex,List interest
  2. 创建该类的对象
  3. 利用FastJSON解析成JSON字符串
  4. 利用Jackson解析成JSON字符串,学生属性中的name更改成username

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人生的乐趣,在于对真知的追求

子曰&#xff1a;朝闻道&#xff0c;夕死可矣&#xff01; 孔子说&#xff1a;早上听到关于世界的真理&#xff0c;哪怕晚上就die了都可以。 这句话很有力量而经常被人引用&#xff0c;表达出我们如何看待沉重的肉身和精神世界。 我们的生活目的&#xff1a;道。 —— 要了解…

MongoDB查询

一、find 1、简单查询 #查寻所有文档 >db.foo.find()#查询包含namehgq的文档 >db.foo.find({"name":"hgq"}) #查询包含namehgq&#xff0c;age12的文档&#xff0c;默认为全部条件都匹配 >db.foo.find({"name":"hgq","…

探究 IP 地址被网站封禁的原因

在我们登录各种网站、APP浏览时&#xff0c;可能会遇到 IP 地址被某些网站封禁的情况。很多人奇怪这是为什么呢&#xff1f; 首先&#xff0c;违反网站的使用规则是比较常见的原因之一。比如&#xff0c;频繁发送垃圾邮件、恶意评论、进行网络攻击或试图破解网站的安全机制等不…

数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 前文 一&#xff0c; 以…

【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别 无名管道&#xff1a; 它是半双工的&#xff0c;具有固定的读端和写端。 只能用于具有亲缘关系的进程之间的通信&#xff08;也是父子进程或者兄弟进程之间&#xff09;。 不是普通的文件&#xff0c;不属于其他任何文件系统&#xff0c;并且只存…

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …

深信服终端安全管理系统EDR版本升级过程

EDR当前版本为3.7.12&#xff0c;具体参考版本详情参数。需要升级到6.0.2R1版本&#xff0c;该版本更改了产品名称&#xff0c;叫做“统一端点安全管理系统aES” 当前版本详情 版本基础信息 软件版本&#xff1a;3.7.12.3829 病毒库版本&#xff1a;20240618174426 漏洞规则库&…

【安全边界】

1.安全边界是什么 安全边界是具有不同安全要求或需求的任意两个区域、子网或环境之间的交叉线。它存在于高安全性区域和低安全性区域之间&#xff0c;例如局域网&#xff08;LAN&#xff09;和互联网&#xff08;Internet&#xff09;之间。 2.为什么要建设安全边界 安全边界…

PHP入门教程5:会话管理和数据库操作

PHP入门教程5&#xff1a;会话管理和数据库操作 在前几篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构、函数的使用、数组和字符串的操作&#xff0c;以及文件处理和表单处理。本文将重点介绍PHP中的会话管理和数据库操作&#xff0c;这是构建动态网站和Web应用程序的…

java.sql.Timestamp用法总结

java.sql.Timestamp用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 概述 java.sql.Timestamp是Java中表示日期和时间的类&#xff0c;它继承自jav…

定制化物联网设备:开启智能生活新篇章

随着科技的进步&#xff0c;物联网&#xff08;IoT&#xff09;已成为我们日常生活和工作中不可或缺的一部分。从智能家居到工业自动化&#xff0c;物联网设备以其独特的功能和特性&#xff0c;极大地提高了我们的生活质量和工作效率。然而&#xff0c;在众多的物联网设备中&am…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中&#xff0c;如果能熟练掌握以下这些使用频率很高的脚本&#xff0c;那工作起来真的是手拿把攥&#xff0c;事半功倍&#xff0c;接下来给大家介绍一些我们日常使用率很高的一些脚本&#xff01; 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…

负利率(Negative Interest Rates)是什么?商业银行会对普通储户实施负利率吗?

负利率是什么&#xff1f; 中文版 负利率是指中央银行或金融机构对存款人收取存款费用&#xff0c;而不是支付利息。这意味着存款人在银行存钱不仅不能赚取利息&#xff0c;反而要支付费用。以下是对负利率的详细解释&#xff1a; 负利率的理解 定义&#xff1a; 负利率意味…

ServletResponse类及其使用方法介绍

在Java Servlet技术中&#xff0c;ServletResponse是一个接口&#xff0c;它定义了服务器响应客户端请求的API。这个接口提供了设置响应头、发送错误、以及管理响应内容的方法。以下是对ServletResponse接口中一些重要方法的介绍以及它们的使用示例。 ServletResponse接口概述…

每年1-1.2万人毕业,男女比例约3:1,测绘工程的就业率如何

测绘工程&#xff0c;一个让人闻风丧胆的理科专业&#xff0c;虎扑评分4.2&#xff1a; 干过测绘的&#xff0c;苦不苦只有大家心里知道&#xff0c;带大家来感受一下&#xff0c;兄弟们的精神状态都十分美妙&#xff1a; 测绘专业到底是什么情况&#xff1f; PS.测绘分为本科…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理&#xff0c;主要规定了以下几个方面&#xff1a; 1. 漏洞发现与识别&#xff1a;要求定期进行漏洞扫描和评估&#xff0c;利用专业的漏洞扫描工具和安全服务&#xff0c;及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

文献解读-流行病学-第十期|《SARS-CoV-2 德尔塔和奥密克戎合并感染和重组的证据》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;流行病学&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Evidence for SARS-CoV-2 Delta and Omicron co-infections and recombination标题&#xff08;中文&#xff09;&#xf…

leetcode402场周赛——构成整天的下标对数目(javascript)

leetcode402场周赛——构成整天的下标对数目 原始题目链接&#xff1a; 402场周赛 题目描述 给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 …

Leetcode 135. 分发糖果(问题分解)

Leetcode 135. 分发糖果 根据描述&#xff0c;可知更多糖果发生在相邻两个孩子的rating更高者中&#xff0c;对于一个孩子来说&#xff0c;左右两侧都视为相邻&#xff0c;即ratings[ i ] > ratings[ i-1 ] 或 ratings[ i ] > ratings[ i1 ]都会令糖果增加 由此则将问题…