当前位置: 首页 > news >正文

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

相关文章:

  • .Net多线程Threading相关详解
  • 数据库大作业——音乐平台数据库管理系统
  • 爬虫的法律风险是什么?以及合法使用爬虫技术的建议。
  • 基于深度学习的光流预测
  • Elasticsearch搜索引擎(高级篇)
  • k8s快速上手实操
  • llama-factory微调chatglm3
  • MySQL数据库的列类型
  • 如何理解shell命令 cd $(dirname $0)
  • matlab 路面点云标线提取
  • 2024年应用科学、航天航空与核科学国际学术会议(ICASANS 2024)
  • 睿治数据治理平台焕新升级,推出全新建模与调度平台
  • 【面试八股总结】Redis数据结构及底层实现
  • 小抄 20240612
  • 应急响应场景及排查思路
  • SegmentFault for Android 3.0 发布
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • echarts花样作死的坑
  • ES6系统学习----从Apollo Client看解构赋值
  • ES6之路之模块详解
  • Java教程_软件开发基础
  • MySQL的数据类型
  • storm drpc实例
  • TCP拥塞控制
  • 解析带emoji和链接的聊天系统消息
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我与Jetbrains的这些年
  • 无服务器化是企业 IT 架构的未来吗?
  • ionic入门之数据绑定显示-1
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.proxy和$.extend
  • $NOIp2018$劝退记
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)Jupyter Notebook 下载及安装
  • (PySpark)RDD实验实战——求商品销量排行
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)c52学习之旅-流水LED灯
  • (转)scrum常见工具列表
  • .“空心村”成因分析及解决对策122344
  • .a文件和.so文件
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net Core 笔试1
  • .NET Core 中插件式开发实现
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net Memory Profiler的使用举例
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题