Java基础22(JSON解析 注解)

目录

一、JSON解析

1. JSON语法

2. JSON的用途

3. Java解析JSON

4. 使用Fastjson 

4.1 Fastjson 的优点

4.2  Fastjson 导包

4.3 Fastjson的主要对象

4.4 常用方法

将Java对象 "序列化"(转换) 为JSON字符串:

将JSON字符串反序列化为Java对象:

将JSON字符串反序列化为JSONArray集合数组:

4.5 一些难点

二、注解

正常情况下会默认过滤null

控制JSON的字段顺序

控制JSON的Date字段格式


一、JSON解析

JSON是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的JavaScript规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

1. JSON语法

  • 使用大括号 { } 保存对象,每个对象由若干数据组成
  • 每个数据由key:value键值对组成
  • 数据之间使用逗号 , 分隔
  • 使用 \ 进行特殊字符的转义

  • 使用中括号 [ ] 保存数组(集合),数组(集合)可以包含多个对象

2. JSON的用途

JSON做为一种轻量级的数据格式,它的用途主要是在计算机系统之间进行数据的传递。JSON作为数据传输的格式,有几个显著的优点:

  • JSON只允许使用UTF-8编码,不存在编码问题;
  • JSON内容仅包含key-value键值对,格式简单,不存在冗余结构,是一种轻量级结构;
  • 浏览器内置JSON支持,如果把数据用JSON发送给浏览器,可以用JavaScript直接处理;

所以,开发Web应用的时候,使用JSON作为数据传输,在浏览器端非常方便。因为JSON天生适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。

3. Java解析JSON

在使用Java进行应用程序的开发中,我们会面临类似“将Java对象转换成JSON格式”或者“将JSON格式的数据转换成Java对象“的需求,所以我们需要掌握如何使用第三方库来进行JSON格式数据的解析。
常用的用于解析JSON的第三方库有:

  • Jackson
  • Gson
  • Fastjson
  • ...

4. 使用Fastjson 

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

4.1 Fastjson 的优点

  • 速度快:fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
  • 使用广泛:fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
  • 测试完备:fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
  • 使用简单:fastjson的 API 十分简洁。
  • 功能完备:支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

4.2  Fastjson 导包

右键new 创建lib文件夹 

将fastjson2-2.0.8.jar 复制进去 并右键添加路径

4.3 Fastjson的主要对象

fastjson 主要使用是JSON接口、JSONObject类、JSONArray类。

  • JSON接口:提供json解析操作的入口方法,用于原始转换。
  • JSONObject类 : 封装json格式的对象。
  • JSONArray 类: 封装json格式的集合

4.4 常用方法

Weather类:

public class Weather {private String temperature; // 温度private String weather; // 天气private String wind; // 风力private String week; // 星期private String city; // 城市private String date_y; // 日期private String dressing_index; // 穿衣指数private String dressing_advice; // 穿衣建议private String uv_index; // 紫外线指数private String comfort_index; // 舒适指数private String wash_index; // 洗衣指数private String travel_index; // 旅行指数private String exercise_index; // 晨练指数private String drying_index; // 晾晒指数get/set方法省略..}

将Java对象 "序列化"(转换) 为JSON字符串:

●JSON.toJSONString(Object object)

测试1:JSON.toJSONString()java对象转成json格式的字符串

Weather w1 = new Weather();w1.setCity("西安");w1.setWeather("炎热");w1.setWind("1级微风");//测试1:JSON.toJSONString()java对象转成json格式的字符串String jsonWeather = JSON.toJSONString(w1);System.out.println(jsonWeather);//{"city":"西安","weather":"炎热","wind":"1级微风"}

测试2:toJsonstring()将List集合或者数组,序列化成JSON格式的字符串

List<Weather> list = new ArrayList<Weather>();Weather w1 = new Weather();w1.setCity("西安");w1.setWeather("炎热");w1.setWind("1级微风");Weather w2 = new Weather();w2.setCity("上海");w2.setWeather("舒适");w2.setWind("2级微风");list.add(w1);list.add(w2);//测试2:toJsonstring()将List集合或者数组,序列化成JSON格式的字符串String jsonWeather = JSON.toJSONString(list);System.out.println(jsonWeather);

测试3:

Map<String, Weather> map = new HashMap<String, Weather>();Weather w1 = new Weather();w1.setCity("西安");w1.setWeather("炎热");w1.setWind("1级微风");Weather w2 = new Weather();w2.setCity("上海");w2.setWeather("舒适");w2.setWind("2级微风");map.put("城市1", w1);map.put("城市2", w2);// 测试3:String resultString = JSON.toJSONString(map);System.out.println(resultString);//{"城市1":{"city":"西安","weather":"炎热","wind":"1级微风"},"城市2":{"city":"上海","weather":"舒适","wind":"2级微风"}}
将JSON字符串反序列化为Java对象:

●JSoN.parseObject(json字符串)转成对象

测试1:将JSON字符串转JsonObject

String jsonString = "{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"}";//将JSON字符串转JsonObject// JSON.parseObject(json字符串)---转JSONObject对象JSONObject object = JSON.parseObject(jsonString);System.out.println(object.get("city"));//西安System.out.println(object.get("weather"));//炎热    System.out.println(object.get("wind"));//1级微风

测试2:将序列化的JSON字符串转成Java对象

String jsonString = "{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"}";//将序列化的JSON字符串转成Java对象//参数1:序列化的JSON字符串,参数2:指定的java对象的类型Weather w1 = JSON.parseObject(jsonString,Weather.class);System.out.println(w1);//Weather [wind=1级微风, weather=炎热, city=西安]

测试3:万能公式

String jsonString = "{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"}";//new TypeReference<T>(){}是万能的,可以转成javabean类型,在T处传入泛型Weather w2 = JSON.parseObject(jsonString,new TypeReference<Weather>() {});System.out.println(w2);//Weather [wind=1级微风, weather=炎热, city=西安]
将JSON字符串反序列化为JSONArray集合数组:

●JSON.parseArray(jsonstring)转字符串为指定JSONArray类型

String jsonString = "[{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"},{\"city\":\"上海\",\"weather\":\"舒适\",\"wind\":\"2级微风\"}]";// JSON.parseArray(jsonstring)转字符串为指定JSONArray类型JSONArray jsonArray = JSON.parseArray(jsonString);for (int i = 0; i < jsonArray.size(); i++) {JSONObject object = jsonArray.getJSONObject(i);System.out.print(object.get("city") + " ");System.out.print(object.get("weather") + " ");System.out.print(object.get("wind"));}输出结果:
西安 炎热 1级微风
上海 舒适 2级微风

●JSON.parseArray(jsonstring,Weather.class)转字符串为指定集合类型

String jsonString = "[{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"},{\"city\":\"上海\",\"weather\":\"舒适\",\"wind\":\"2级微风\"}]";// JSON.parseArray(jsonstring,Weather.class)转字符串为指定集合类型List<Weather> list = JSON.parseArray(jsonString, Weather.class);for (Weather weather : list) {System.out.println(weather);}输出结果:
Weather [wind=1级微风, weather=炎热, city=西安]
Weather [wind=2级微风, weather=舒适, city=上海]

●new TypeReference<T>(){}万能的,可以转成javabean对象,在T处传泛型

String jsonString = "[{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"},{\"city\":\"上海\",\"weather\":\"舒适\",\"wind\":\"2级微风\"}]";//new TypeReference<T>(){}万能的,可以转成javabean对象,在T处传泛型Weather[] list1 = JSON.parseObject(jsonString, new TypeReference<Weather[]>() {});for (Weather weather : list1) {System.out.println(weather);}输出结果:
Weather [wind=1级微风, weather=炎热, city=西安]
Weather [wind=2级微风, weather=舒适, city=上海]

4.5 一些难点

//JSONObject:
//get() -----Object(JSONObject)
//getJSONObject()------JSONObject()
//getJSONArray() ----- JSONArray()
//getObject(,weath.class)-----javaBean()
public class Demo06 {public static void main(String[] args) {String jsonString = "{\"城市1\":{\"city\":\"西安\",\"weather\":\"炎热\",\"wind\":\"1级微风\"},\"城市2\":{\"city\":\"齐齐哈尔\",\"weather\":\"舒适\",\"wind\":\"2级微风\"}}";//JSON.parseObject方法将JSON格式的字符串转成JSONObject对象JSONObject jsonObject = JSON.parseObject(jsonString);//get()获取JSONObject中值--返回值类型是ObjectJSONObject object1 = (JSONObject) jsonObject.get("城市1");//getJSONObject()获取JSONObject中的键对应的值----返回值类型jsonObjectJSONObject object2 = jsonObject.getJSONObject("城市2");//getObject(key,类型)获取JSONObject中的键对应的值s--返回值类型是javaBean类型Weather w1 = jsonObject.getObject("城市1", Weather.class);System.out.println(object1.get("city"));System.out.println(object2.get("city"));System.out.println(w1);// 转回到Map类型
//万能公式转成对应javabean类型Map<String, Weather> map1 = JSON.parseObject(jsonString, new TypeReference<Map<String, Weather>>() {});Weather weather1 = map1.get("城市1");Weather weather2 = map1.get("城市2");System.out.println(weather1.getCity());System.out.println(weather2.getCity());}}
public class Demo07 {public static void main(String[] args) {// 解析json字符串String jsonString = jsonMethd();System.out.println(jsonString);// 转成JSONObject类型的对象JSONObject jsonObject = JSON.parseObject(jsonString);// 获取键对应的值,getJSONObject--JSONObjectJSONObject object1 = jsonObject.getJSONObject("城市1");System.out.println(object1.get("city"));// 获取JSONObject中key对应的值//		getObject()转成javabean对象
//		Weather w1=jsonObject.getObject("城市1", Weather.class);
//		System.out.println(w1.getCity());// 获取键对应的JSONArray对象,方法getJSONArray()JSONArray array1 = jsonObject.getJSONArray("未上榜的城市");for (int i = 0; i < array1.size(); i++) {JSONObject obj1 = array1.getJSONObject(i);System.out.println(obj1.get("city"));}//		转成对应的javabean类型的对象
//		List<Weather> list = JSON.parseArray(array1.toString(),Weather.class);
//		List<Weather> list = jsonObject.getList("未上榜的城市", Weather.class);
//		for (Weather weather : list) {
//			System.out.println(weather.getCity());
//		}}/*** @return 生成json字符串,{key:{},key:[{},{}]}*/public static String jsonMethd() {Map<String, Object> map = new HashMap<String, Object>();List<Weather> list = new ArrayList<Weather>();Weather w1 = new Weather();w1.setCity("西安");w1.setWeather("炎热");w1.setWind("1级微风");Weather w2 = new Weather();w2.setCity("齐齐哈尔");w2.setWeather("舒适");w2.setWind("2级微风");list.add(w1);list.add(w2);map.put("城市1", w1);map.put("未上榜的城市", list);String jsonString = JSON.toJSONString(map);return jsonString;}}

二、注解

正常情况下会默认过滤null

解决:转换成JSON字符串时,使用Feature枚举值进行设置。

Map<String, String> map = new HashMap<String, String>();map.put("姓名", "zkt");map.put("年龄", "21");map.put("收入", null);//正常情况下会默认过滤nullString jsonResultString = JSON.toJSONString(map, Feature.WriteMapNullValue);System.out.println(jsonResultString);//{"姓名":"zkt","收入":null,"年龄":"21"}

常用枚举值:

Feature.WriteMapNullValue

如果Map中包含Null值,则输出,不会过滤

Feature.WriteNullListAsEmpty

如果输出的List值为Null,则输出[ ],不会输出Null

Feature.WriteNullStringAsEmpty

如果输出的字符串值为Null,则输出“”,不会输出Null

Feature.WriteNullNumberAsZero

如果输出的数字值为Null,则输出0,不会输出Null

Feature.UseSingleQuotes

使用单引号

public class Demo02 {public static void main(String[] args) {User user = new User();user.setName("zkt");user.setDate(new Date());String jsonResult = JSON.toJSONString(user,Feature.WriteMapNullValue,Feature.UseSingleQuotes,Feature.WriteNullListAsEmpty,Feature.WriteNullNumberAsZero,Feature.WriteNullBooleanAsFalse,Feature.WriteNullStringAsEmpty);System.out.println(jsonResult);//{'姓名':'zkt','userAddress':[],'schoolString':'','flag':false,'date':null}}
}

控制JSON的字段顺序

j解决:输出结果与字段定义顺不一致。需要在定义实体类字段时,使用@JSONField注解的ordinal属性进行顺序配置。

@JSONFieldordina1用来设置成员变量的顺序,值越小,越靠前name序列化后的字符串的名称serialize是否要序列化此字段format格式化日期

控制JSON的Date字段格式

解决:输出日期字段时,默认格式不符合需求时,可以在定义实体类的Date字段,使用@JSONField注解的format属性进行格式配置。

public class User {@JSONField(ordinal = 1,name = "姓名")private String name;@JSONField(ordinal = 2,serialize = false)private Integer userLevel;@JSONField(ordinal = 3)private List<String> userAddress;@JSONField(ordinal = 4)private String schoolString;@JSONField(ordinal = 5)private Boolean flag;@JSONField(ordinal = 6,format = "yyyy年MM月dd日")private Date date;get/set方法省略..
}

Demo02 输出结果:

{'姓名':'zkt','userAddress':[],'schoolString':'','flag':false,'date':'2024年05月23日'}

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

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

相关文章

YOLOv5改进策略:Focaler-IoU损失函数改进

文章目录 1、前言2、摘要3、Focaler-IoU&#xff1a;4、代码实现5、目标检测系列文章 1、前言 ​ 目标检测是计算机视觉的基本任务之一&#xff0c;旨在识别图像中的目标并定位其位置。目标检测算法可分为基于锚点和无锚点的方法。基于锚点的方法包括Faster R-CNN、YOLO系列、…

详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)

目录 前言1. 基本知识2. Demo3. 实战4. 模版 前言 由于需要在登录时&#xff0c;附上一些用户说明书的弹窗 对于ElMessageBox的基本知识详细了解 可通过官网了解基本的语法知识ElMessageBox官网基本知识 1. 基本知识 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;其中…

20240523每日运维--------聊聊docker简介(一)

dotCloud 说Docker&#xff0c;必不可免不得不说dotCloud&#xff0c;Docker本来只是dotCloud公司的内部项目&#xff0c;其公司创始人 Solomon Hykes 发了一个内部项目&#xff0c;而这个项目就是Docker&#xff0c;自从2013年docker开源以后&#xff0c;在世界范围引起相当轰…

对于高速信号完整性,一块聊聊啊(12)

常见的无源电子器件 电子系统中的无源器件可以按照所担当的电路功能分为电路类器件、连接类器件。 A、电路类器件&#xff1a; &#xff08;1&#xff09;二极管&#xff08;diode&#xff09; &#xff08;2&#xff09;电阻器&#xff08;resistor&#xff09; &#xf…

浅谈对称加密非对称加密

对称加密&#xff1a;加密和解密使用的密钥是同一个 常见算法&#xff1a;DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES非对称加密&#xff1a;需要两个密钥&#xff0c;一个公开密钥、一个私有密钥 常见算法&#xff1a;RSA、ECC&#xff08;移动设备用&#xff09;、Dif…

归并排序算法(经典、常见)

今天我们不刷力扣了&#xff0c;我们来复习&#xff08;手撕&#xff09;一下数据结构中的八大排序算法之一&#xff0c;归并排序 基本概念&#xff1a; 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&am…

【网络技术】【Kali Linux】Wireshark嗅探(十五)SSDP(简单服务发现协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

与MySQL DDL 对比分析OceanBase DDL的实现

本文将简要介绍OceanBase的DDL实现方式&#xff0c;并通过与MySQL DDL实现的对比&#xff0c;帮助大家更加容易理解。 MySQL DDL 的算法 MySQL 的DDL实现算法主要有 copy、inplace和instant。 copy copy算法的实现相对简单&#xff0c;MySQL首先会创建一个临时表&#xff0…

C++:STL

STL 文章目录 STLSTL 绪论迭代器&#xff08;iterators&#xff09;容器&#xff08;Containers&#xff09;vectorset,multisetmap,multimapstackqueuedequepriority_queuebitset 算法&#xff08;Algorithms&#xff09;sort,count,find,lower_bound,upper_bound,binary_sear…

(2024,attention,可并行计算的 RNN,并行前缀扫描)将注意力当作 RNN

Attention as an RNN 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 注意力作为一种&#xff08;多对一的&#xff09;RNN 3.2 注意力作为&#xff08;多对多&…

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI&#xff0c;一套是html写的&#xff0c;一套是编译后的前端 后台功能很完善&#xff0c;带预设、首充返佣、三级分销机制、代理功能。 东西很简单&#xff0c;首页就是红绿灯的下注页面&#xff0c;玩法虽然单一&#xff0c;好在不残缺可以正常跑。

Putty: 随心御剑——远程启动服务工具plink

一、引言:如何远程控制 也许你会有这样的场景,交互程序(以下简称UI程序)跑在windows端,而控制程序跑在Linux上。我们想要通过windows端 UI程序来启动Linux下面的服务,来一场酣畅淋漓的御剑飞行咋办,难道要自己十年磨一剑,在Linux下编写一个受控服务程序么.计算机科技发…

【MATLAB】信号的熵

近似熵、样本熵、模糊熵、排列熵|、功率谱熵、奇异谱熵、能量熵、包络熵 代码内容&#xff1a; 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复信号的熵本公众号致力于解决找代码难&#xff0c;写代码怵。各位有什么急需…

FreeRTOS中断中释放信号量

串口接收&#xff1a;中断程序中逆序打印字符串 串口接收&#xff1a;逆序回环实验思路 注&#xff1a;任务优先级较高会自动的切换上下文进行运行 FreeRTOS中的顶半操作和底半操作 顶半操作和底半操作“这种叫法源自与Linux”在嵌入式开发中&#xff0c;为了和Linux操作系统做…

Linux网络编程: 网络基础

Linux网络编程: 网络基础 1.网络划分 一.网络通信1.网络通信和本地通信的联系2.网络通信与本地通信最本质的区别及其衍生出的问题 二.网络协议初识1.为何本地通信不行&#xff1f;2.打电话的例子体会分层模型的好处3.OSI七层模型的提出4.OSI七层模型与TCP/IP五层模型1.TCP/IP与…

二十九篇:构建未来:信息系统的核心框架与应用

构建未来&#xff1a;信息系统的核心框架与应用 1. 引言 在这个充满挑战和机遇的信息时代&#xff0c;信息系统已经成为现代组织不可或缺的神经中枢。它们不仅革新了我们处理信息的方式&#xff0c;更是极大地增强了决策制定的效率和质量。在这篇文章中&#xff0c;我将分享我…

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

在Java编程中&#xff0c;BeanUtil工具类是一种强大且便捷的工具&#xff0c;用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能&#xff0c;通过详细的代码示例展示其应用&#xff0c;并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…

5.26牛客循环结构

1002. 难点&#xff1a; 两层循环条件设置 思路 可以设置三个变量 代码 1003 思路&#xff1a; 与星号双塔差不多&#xff0c;在此基础上加大一点难度 每日练题5.23 &#xff08;EOF用法&#xff09;-CSDN博客 代码 1004 代码

Android Compose 八:常用组件 Switch

Switch 切换按钮 val isChecked remember { mutableStateOf(true) }Switch(checked isChecked.value,onCheckedChange {Log.i("text_compose","onCheckedChange>>"it)isChecked.value it})效果 默认颜色 应该对应 主题色 1.1 thumbContent 按钮…

Python Beautiful Soup 使用详解

大家好&#xff0c;在网络爬虫和数据抓取的领域中&#xff0c;Beautiful Soup 是一个备受推崇的 Python 库&#xff0c;它提供了强大而灵活的工具&#xff0c;帮助开发者轻松地解析 HTML 和 XML 文档&#xff0c;并从中提取所需的数据。本文将深入探讨 Beautiful Soup 的使用方…