66_1JSON【浏览器中处理JSON、Java中处理JSON(FastJSON、Jackson)】、Java中的bean

JSON

概念

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

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

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

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

1.浏览器中处理JSON

json字符串→ js对象
法1:parse()

注意:使用parse解析json格式的字符串,该字符串必须使用单引号包裹着双引号

		<script type="text/javascript">//json格式的字符串var jsonStr = '{"name":"Java从入门到精通","price":100}';//将json格式的字符串转换为js对象var jsObj = JSON.parse(jsonStr);alert(jsObj.name + " -- " + jsObj.price);</script>
法2:eval()

注意:eval去解析json格式的字符串,必须使用小括号括起来

<script type="text/javascript">//json格式的字符串var jsonStr = "({'name':'Java从入门到精通','price':100})";//将json格式的字符串转换为js对象var jsObj = eval(jsonStr);alert(jsObj.name + " -- " + jsObj.price);</script>
json字符串→ js数组
法2:eval()

注意:json格式字符串转数组,不用使用小括号,因为JS中数组使用中括号,eval能够识别到中括号是数组

<script type="text/javascript">//json格式的字符串var jsonStr = "[{'name':'Java从入门到精通','price':100},{'name':'MySQL从删库到跑路','price':200}]";//将json格式的字符串转换为js数组var jsArr = eval(jsonStr);for(var i = 0;i<jsArr.length;i++){var jsObj = jsArr[i];alert(jsObj.name + " -- " + jsObj.price);}</script>
js对象、js数组→ json字符串
stringify()
<script type="text/javascript">//js对象var book = new Object();book.name = "Java从入门到精通";book.price = 100;//将js对象转json格式的字符串var jsonStr = JSON.stringify(book);alert(jsonStr);</script>
	<script type="text/javascript">//js对象var book1 = new Object();book1.name = "Java从入门到精通";book1.price = 100;var book2 = new Object();book2.name = "MySQL从删库到跑路";book2.price = 200;//js数组var jsArr = [book1,book2];//将js数组转json格式的字符串var jsonStr = JSON.stringify(jsArr);alert(jsonStr);</script>

2.Java中处理JSON

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

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

FastJSON

概念

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

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

  1. JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
  2. JSONObject:FastJSON提供的json对象
  3. JSONArray:FastJSON提供json数组对象
特点
  1. FastJson速度快,无论序列化和反序列化,都是当之无愧的fast
  2. 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  3. 零依赖(没有依赖其它任何类库)
导jar包
java对象→ json字符串

toJSONString()

 @Testpublic void test01(){//Java对象Book book = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));//Java对象转JSON格式的字符串String jsonStr = JSON.toJSONString(book);//{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100}System.out.println(jsonStr);}
输出:{"author":{"info":"从事Java20年","name":"奇男子"},"name":"Java从入门到精通","price":100}
+过滤器toJSONString( book, new PropertyFilter());
    @Testpublic void test02(){//Java对象Book book = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));//Java对象转JSON格式的字符串 -- 过滤author对象里的name属性//思考题:研究toJSONString的底层逻辑String jsonStr = JSON.toJSONString(book, new PropertyFilter() {@Overridepublic boolean apply(Object o, String s, Object o1) {if(o.getClass() == Author.class && s.equals("name")){return false;}return true;}});System.out.println(jsonStr);}
输出:{"author":{"info":"从事Java20年"},"name":"Java从入门到精通","price":100}
json字符串→ java对象
parseObject(jsonStr, Book.class)
    @Testpublic void test01(){//JSON格式的字符串String jsonStr = "{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100}";Book book = JSON.parseObject(jsonStr, Book.class);System.out.println(book);}
输出:Book{name='Java从入门到精通', price=100.0, author=Author{name='奇男子', info='从事Java开发20年'}}
java数组、集合→ json字符串

注意:在相互转换过程中需要注意数据的格式

将java数组 转换为 json格式的字符串

JSON.toJSONString(books)

将Collection集合 转换为 json格式的字符串

JSON.toJSONString(list);

将Map集合 转换为json格式的字符串

JSON.toJSONString(map);

public class Test03 {@Testpublic void test01(){//将java数组 转换为 json格式的字符串//数组Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));Book[] books = {book1,book2};//将java数组 转换为 json格式的字符串String jsonStr = JSON.toJSONString(books);//[{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}]System.out.println(jsonStr);}@Testpublic void test02(){//将Collection集合 转换为 json格式的字符串//Collection集合Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));List<Book> list = Arrays.asList(book1, book2);//将Collection集合 转换为 json格式的字符串String jsonStr = JSON.toJSONString(list);//[{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}]System.out.println(jsonStr);}@Testpublic void test03(){//将Map集合 转换为json格式的字符串//Map集合Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));HashMap<String, Book> map = new HashMap<>();map.put("001",book1);map.put("002",book2);//将Map集合 转换为json格式的字符串String jsonStr = JSON.toJSONString(map);//{"001":{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},"002":{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}}System.out.println(jsonStr);}
}
json字符串→ java数组、集合

将json格式的字符串 转换为 java数组

​ 1.将json格式的字符串转换为JSONArray对象

​ JSONArray.parseArray(jsonStr);

​ 2.获取指定类型的对象遍历存入数组

​ jsonArray.getObject(i, Book.class);

将json格式的字符串 转换为 Collection集合

JSONArray.parseArray(jsonStr, Book.class);

将json格式的字符串 转换为 Map集合

Map<String,Book> map = (Map<String, Book>) JSONArray.parse(jsonStr);

public class Test04 {@Testpublic void test01(){//将json格式的字符串 转换为 java数组//json格式的字符串String jsonStr = "[{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}]";//将json格式的字符串转换为JSONArray对象JSONArray jsonArray = JSONArray.parseArray(jsonStr);Book[] books = new Book[jsonArray.size()];for (int i = 0;i<jsonArray.size();i++){Book book = jsonArray.getObject(i, Book.class);books[i] = book;}for (Book book : books) {System.out.println(book);}}@Testpublic void test02(){//将json格式的字符串 转换为 Collection集合//json格式的字符串String jsonStr = "[{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}]";//将json格式的字符串 转换为 Collection集合List<Book> books = JSONArray.parseArray(jsonStr, Book.class);for (Book book : books) {System.out.println(book);}}@Testpublic void test03(){//将json格式的字符串 转换为 Map集合//json格式的字符串String jsonStr = "{\"001\":{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},\"002\":{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}}";//将json格式的字符串 转换为 Map集合Map<String,Book> map = (Map<String, Book>) JSONArray.parse(jsonStr);Set<Map.Entry<String, Book>> entries = map.entrySet();for (Map.Entry<String, Book> entry : entries) {System.out.println(entry);}}
}

Jackson

概念

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

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

​ jackson-annotations-2.9.8.jar

​ jackson-databind-2.9.8.jar

特点

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

java对象、集合 → 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);}
}
JSON字符串 → java对象、集合
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 mapper = new ObjectMapper();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);}}
}
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 mapper = new ObjectMapper();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("xxx");//测试是否调用输出this.name = name;this.price = price;this.author = author;}public Book(String name, double price) {this.name = name;this.price = price;}
...
}

补充:Java中的bean

概念:

Java中的bean是一种遵循特定约定的类,用于数据传输、持久化、业务逻辑和视图模型等。

特点:

  • 无状态:bean通常不依赖于外部状态,这使得它们可以在多个线程或请求中重复使用。
  • 可序列化:bean可以轻松地保存和加载,这对于数据持久化和网络传输非常有用。
  • 遵守JavaBean规范:包括属性、方法和事件的规范,这些规范使得bean易于理解和使用。

优点:

它们提供了代码的可复用性、易于维护和跨平台兼容性的优点。‌

应用场景:

Java中的bean主要用于数据传输、持久化、业务逻辑和视图模型等方面。它们提供了一种方式来封装和复用代码,使得开发人员可以更容易地构建和维护应用程序。

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

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

相关文章

oracle创建账户

1、查看表空间 SELECT tablespace_name FROM user_tablespaces;2、创建用户 CREATE USER FLINKCDC2 IDENTIFIED BY "123456";也可以使用指定表空间的方式 CREATE USER FLINKCDC2 IDENTIFIED BY "123456" DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMIT…

基于resttemplate实现微服务调用

子工程搭建与管理 新建一个cloud模块来作为公共模块&#xff0c;cloud模块中将管理用于微服务使用各个组件 euerka中的配置 package com.lingyang.euerka.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configu…

网络安全在2024好入行吗?

前言 024年的今天&#xff0c;慎重进入网安行业吧&#xff0c;目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多&#xff0c;还有很多高中被挖过来的大佬。 理由很简单&#xff0c;目前来说&#xff0c;信息安全的圈子人少&#xff0c;985、211院校很多都才建立…

[NOIP2007 普及组] 守望者的逃离 题解

题意 给定 M ( 0 ≤ M ≤ 1 0 3 ) , S ( 1 ≤ S ≤ 1 0 8 ) , T ( 1 ≤ T ≤ 3 1 0 5 ) M(0 \leq M \leq 10^3),S(1 \leq S \leq 10^8),T(1 \leq T \leq 3\times 10^5) M(0≤M≤103),S(1≤S≤108),T(1≤T≤3105)&#xff0c;守望者开始在位置 0 0 0&#xff0c;对于每一秒&…

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…

Typora使用教程-修改配置文件-免费使用

Typora特点 简洁美观&#xff1a;Typora的界面非常简洁&#xff0c;没有繁琐的菜单和工具栏&#xff0c;只有一个干净的编辑窗口。它使用 Markdown语法&#xff0c;将文本转化为漂亮的排版&#xff0c;无需关注样式和格式的细节。所见即所得&#xff1a;Typora实时显示Markdow…

Zotero更改插入word中所有引用编号的颜色

002-如何批量更改Zotero插入在word中参考文献的颜色&#xff08;快速变蓝&#xff09; 主要根据此视频进行学习。 需要记住 查找的内容为&#xff1a; ^19 ADDIN ZOTERO_ITEM 在word中打开 文件->更多->选项->高级 下滑选择域底纹&#xff0c; 可以看到所有的引用 …

[图解]用例规约之扩展路径

1 00:00:01,710 --> 00:00:03,670 基本路径写完之后 2 00:00:04,690 --> 00:00:07,270 接下来就是扩展路径 3 00:00:08,620 --> 00:00:14,000 扩展路径就是系统要处理的意外和分支 4 00:00:14,010 --> 00:00:19,710 系统要处理的 5 00:00:20,970 --> 00:00:…

ceph如何增删改查的管理文件

1.创建 Ceph 存储库文件 sudo tee /etc/yum.repos.d/ceph.repo <<EOF [ceph] nameCeph packages for $basearch baseurlhttps://download.ceph.com/rpm-pacific/el8/\$basearch/ enabled1 gpgcheck1 typerpm-md gpgkeyhttps://download.ceph.com/keys/release.asc[ceph-…

【python】Python如何调用外部命令,subprocess模块的详细解读以及应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

MySQL InnoDB中一个update语句从执行到提交的全过程(3)

接上文MySQL InnoDB中一个update语句从执行到提交的全过程&#xff08;2&#xff09;-CSDN博客 目录 六、本地提交 怎样保证binlog和redo log的状态一致呢&#xff1f; MySQL 中的内部 XA 机制 宕机时不同状态的处理 物理落盘策略 七、主备复制 八、返回提交成功 总结一…

目标检测之数据增强

一、概述 数据增强是一种通过人工或自动方式对数据进行修改或变换&#xff0c;以增加数据集规模和多样性的技术。在机器学习中&#xff0c;数据增强被广泛应用于解决数据稀缺、数据不平衡、数据噪声等问题&#xff0c;提高模型的泛化能力和鲁棒性。 二、为什么需要数据增强 …

吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…

达梦数据库系列—49.审计功能

目录 1、打开审计 2、审计级别 系统级审计 语句级审计 对象级审计 3、审计文件管理 删除审计文件 查看审计信息 4、审计分析 审计分析工具Analyzer 审计分析工具dmaudtool 1、打开审计 0&#xff1a;关闭审计1&#xff1a;打开普通审计2&#xff1a;打开普通审计和…

Linux 进程间通信之管道

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、通信 1、进程为什么要通信&#xff1f; 1.数据的类型 2.父进程和子进程算通信吗&#xff1f; 2、进程如何通信&#xff1f; 3、进程通信的常见方式&#xff1f; 二、管道 1、概念…

Java家教一对一系统小程序源码

&#x1f31f;【家教新风尚&#xff0c;一对一系统引领学习革命】&#x1f31f; &#x1f4da; 个性化定制&#xff0c;学习更高效 你还在为孩子的学习成绩提升缓慢而烦恼吗&#xff1f;家教一对一系统&#xff0c;正是解决这一难题的钥匙&#xff01;它根据孩子的年龄、兴趣…

动手学深度学习(pytorch)学习记录12-激活函数[学习记录]

激活函数 激活函数&#xff08;activation function&#xff09;通过计算加权和并加上偏置来确定神经元是否应该被激活&#xff0c; 它们将输入信号转换为输出的可微运算。 import torch import matplotlib.pyplot as plt 简单定义一个画图的函数 def graph_drawing(x_,y_…

static、extern,const关键字

1、static关键字 static关键字&#xff1a;延长生命周期&#xff0c;限制作用域 static修饰局部变量&#xff1a;静态局部变量 static修饰全局变量&#xff1a;静态全局变量 static修饰函数&#xff1a;静态函数 2、extern关键字 extern&#xff1a;引用其他文件 .c 中的全局…

私域场景中的数字化营销秘诀

​在当今的商业世界&#xff0c;私域场景的营销变得愈发重要。今天咱们就来深入探讨一下私域场景中的几个关键营销手段。 一、会员管理与营销 企业一旦拥有完善的会员体系&#xff0c;数字化手段就能大放异彩。它可以助力企业对会员进行精细划分&#xff0c;深度了解会员的消费…