Java基础22(JSON解析 注解)

news2024/11/17 6:31:13

目录

一、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中值--返回值类型是Object
		JSONObject object1 = (JSONObject) jsonObject.get("城市1");

//getJSONObject()获取JSONObject中的键对应的值----返回值类型jsonObject
		JSONObject 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--JSONObject
		JSONObject 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);

		//正常情况下会默认过滤null
		String 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属性进行顺序配置。

@JSONField
     ordina1用来设置成员变量的顺序,值越小,越靠前
     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.coloradmin.cn/o/1684300.html

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

相关文章

薪资不公、晋升无望?动笔写一份申诉材料吧!

薪资不公、晋升无望&#xff1f;动笔写一份申诉材料吧&#xff01; 引言&#xff1a;每个努力工作的人都值得公平对待 在职场上&#xff0c;我们付出了汗水和智慧&#xff0c;期待着相应的回报——合理的工资和公正的晋升机会。然而&#xff0c;现实并不总是如此美好。当你感觉…

康谋分享 | aiSim5基于生成式AI扩大仿真测试范围(终)

在前面的几章节中探讨了aiSim仿真合成数据的置信度&#xff0c;此外在场景重建和测试流程闭环的过程中&#xff0c;难免会面临3D场景制作重建耗时长、成本高、扩展性低以及交通状况复杂程度难以满意等问题&#xff0c;当前的主要挑战在于如何自动化生成3D静态场景并添加动态实例…

深入理解C#中的IO操作 - FileStream流详解与示例

文章目录 一、FileStream类的介绍二、文件读取和写入2.1 文件读取&#xff08;FileStream.Read&#xff09;2.2 文件写入&#xff08;FileStream.Write&#xff09; 三、文件复制、移动和目录操作3.1 文件复制&#xff08;FileStream.Copy&#xff09;3.2 文件移动&#xff08;…

VMware ESXI 7.0安装部署

1、为什么要虚拟化&#xff1f; 目前&#xff0c;物理服务器存在以下几个问题&#xff1a; 1&#xff09;硬件资源利用率低&#xff1b; 2&#xff09;可靠性不足&#xff0c;物理服务器宕机即可造成整体业务停摆&#xff1b; 3&#xff09;维护量大&#xff0c;无法实现统…

H5228 6.5-75V60V48V36V24V12V 升降压芯片LED恒流驱动IC 支持无频闪数转模调光

H5228 是款调光特性良好的宽范围调光比且无频闪调光的 LED 恒流驱动器。支持降压、 升压和升降压拓扑的应用&#xff0c;具有 6.5~75V 宽输入工作电压范围&#xff0c;采用连续电流模式&#xff08;CCM&#xff09; 为高亮度 LED 供电。调光深度可调很低&#xff0c;在低亮负…

计算机缺失ffmpeg.dll如何修复,五种详细的修复教程分享

当你在使用电脑过程中&#xff0c;突然遇到系统或软件弹出提示信息&#xff0c;告知“ffmpeg.dll文件丢失”怎么办&#xff1f;当电脑提示ffmpeg.dll丢失时&#xff0c;可能会导致一些应用程序无法正常运行或出现错误提示。下面我将介绍5种解决电脑提示ffmpeg.dll丢失的方法。 …

【Linux】:进程切换

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux进程切换的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

全面了解CC攻击和防范策略

前言 “ CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。” 什么是CC攻击&#xff1f; CC攻击前身是一个名为Fatboy的攻击程序&#xff0c;而之所以后来人们会称之为CC&#xff0c;也叫HTTP-FLOOD&#xff…

浅谈面向对象--多态

接口 接口概述 我们要完成一个工程&#xff0c;需要一个插座 思考1&#xff1a;去市场买个回来&#xff01;> 市场上有公牛、小米... > 小米和公牛认识吗&#xff1f;什么原因导致公牛和小米的插座我都可以用 接口是一种约定的规范&#xff0c;是多个抽象方法的集合&…

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

【每日刷题】Day47

【每日刷题】Day47 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; 2. 2404. 出现最频繁的偶数元素 - 力扣&am…

PPT图片高清导出

PPT制作的图片高清导出 适用于windows系统 案例 例如想要导出下面这张图片 1. 保存为emf文件 2. 将emf文件导入画图软件 导入方法直接将emf文件拖进去就行&#xff0c;可以看到图片成功高清显示&#xff08;可以通过放缩检查是否模糊&#xff09;。 3. 修改分辨率 点击上方…

Redis协议的请求和响应有哪些“套路”可循?no.18

Redis 协议 Redis 支持 8 种核心数据结构&#xff0c;每种数据结构都有一系列的操作指令&#xff0c;除此之外&#xff0c;Redis 还有事务、集群、发布订阅、脚本等一系列相关的指令。为了方便以一种统一的风格和原则来设计和使用这些指令&#xff0c;Redis 设计了 RESP&#…

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问&#xff0c;丢失您的基本数据总是有压力的&#xff0c;尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件&#xff0c;您可以借助视频恢复工具。但是&#xff0c;在选择最佳视频恢复工具时&#xff0c;您必须考虑多个扫描选项&…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

紫光展锐突破创新终端品类,搭载展锐芯的全球首款二合一5G云电脑正式发布

近日&#xff0c;搭载紫光展锐5G芯片T760的中兴云电脑逍遥系列正式发布&#xff0c;亮点&#xff1a; 全球首款二合一5G云电脑&#xff0c;支持本地/云端双模式&#xff0c;一键切换&#xff0c;用户可同时享有Android平板和Windows云电脑两种形态&#xff1b;支持5G蜂窝网络&…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档&#xff1a;Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务&#xff0c;复…

DeepDriving | CUDA编程-02: 初识CUDA编程

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-02&#xff1a; 初识CUDA编程 上一篇文章DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客介绍了如何搭建CUDA编程环境&a…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日&#xff0c;由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布&#xff0c;阿里云数据库 SelectDB 版在中国站及国际站全面发布&#xff0c;正式开启商…

5. JVM面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 说一下JVM的主要组成部分及其作用? JVM包含两个子系统和两个组件&#xff0c;两个子系统为Class loader(类装载)、Execution engine(执行引擎)&#xff1b;两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Cl…