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

Java处理JSON

Java处理json有很多种方法,在这里总结一下。

1 Jackson

Spring MVC 默认采用Jackson解析Json,出于最小依赖的考虑,也许Json解析第一选择就应该是Jackson。

1.1 引入的包

Jackson核心模块由三部分组成:jackson-core、jackson-annotations、jackson-databind。
由于jackson-databind 依赖 jackson-core 和 jackson-annotations,所以只显示地添加jackson-databind依赖,jackson-core 和 jackson-annotations 就会隐式地添加到 Java 项目工程中。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.6</version>
</dependency>

1.2 ObjectMapper类

ObjectMapper类是Jackson中基于“对象绑定”的API,可以将JSON映射到Java对象(反序列化),也可以将Java对象映射到JSON(序列化)

默认情况下,Jackson通过匹配JSON字段名称与Java类的getter&setter方法名,将JSON的字段映射到Java类的属性。Jackson删除了getter&setter方法名称的getset部分,并将其余名称的第一个字符转换为小写后,和JSON字段名称做比较,相同即匹配上。
举例,如果有Java类如下:

public class Car {private String brand = null;private int doors = 0;// getter & Setterpublic String getBrand() { return this.brand; }public void   setBrand(String brand){ this.brand = brand;}public int    getDoors() { return this.doors; }public void   setDoors(int doors) { this.doors = doors; }
}

1.2.1 反序列化:从JSON获得Java对象

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // false表示忽略没有匹配上的JSON字段String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; // JSON字符串
Car car = objectMapper.readValue(carJson, Car.class); // 从JSON字符串获取对象
Reader reader = new StringReader(carJson); // JSON字符输入流
car = objectMapper.readValue(reader, Car.class); // 从JSON字符输入流获取对象
// 类似的还有从File对象、URL对象、InputStream对象(字节输入流)、字节数组等获取java对象String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]"; // JSON字符串(数组)
List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){}); // 从JSON数组字符串获取Java对象的数组String jsonObject = "{\"brand\":\"ford\", \"doors\":5}"; // JSON字符串(Map)
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject, new TypeReference<Map<String,Object>>(){}); // 从JSON字符串获取Java Map

注意:还可以自定义反序列化规则,这里不详解。

1.2.2 序列化:将Java对象写入JSON

ObjectMapper objectMapper = new ObjectMapper();Car car = new Car();
car.setBrand("BMW");
car.setDoors(4);String json = objectMapper.writeValueAsString(car); // 将Java对象序列化为JSON字符串
objectMapper.writeValue(new FileOutputStream("data/output-2.json"), car); // 将Java对象序列化为JSON字符串并写入文件

注意:同样可以自定义序列化规则,这里不详解。

1.3 JsonNode类

如果不知道接收到的JSON格式,可以将其转换为JsonNode类,即Jackson的JSON树模型。

1.3.1 JSON字符串和JsonNode对象相互转换

ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
try {JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class); // 将JSON字符串转为JsonNode对象// JsonNode jsonNode = objectMapper.readTree(carJson); // 和上一行代码功能完全相同
} catch (IOException e) {e.printStackTrace();
}
String json = objectMapper.writeValueAsString(jsonNode); // 将JsonNode对象转为JSON字符串

1.3.2 JsonNode类访问JSON字段

ObjectMapper objectMapper = new ObjectMapper();
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5," +"  \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +"  \"nestedObject\" : { \"field\" : \"value\" } }";
try {JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);// 字符串JsonNode brandNode = jsonNode.get("brand");String brand = brandNode.asText();System.out.println("brand = " + brand);// 整型JsonNode doorsNode = jsonNode.get("doors");int doors = doorsNode.asInt();System.out.println("doors = " + doors);// 数组JsonNode array = jsonNode.get("owners");JsonNode jsonNode = array.get(0);String john = jsonNode.asText();System.out.println("john  = " + john);// 子JSONJsonNode child = jsonNode.get("nestedObject");JsonNode childField = child.get("field");String field = childField.asText();System.out.println("field = " + field);
} catch (IOException e) {e.printStackTrace();
}

1.3.3 Java对象和JsonNode对象相互转换

ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.brand = "Cadillac";
car.doors = 4;
JsonNode carJsonNode = objectMapper.valueToTree(car); // Java对象转JsonNode对象
Car car0 = objectMapper.treeToValue(carJsonNode); // JsonNode对象转Java对象

1.3.4 JsonNode类的set、put、remove

ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode(); // 创建空的JsonNode对象
JsonNode childNode = readJsonIntoNode();
objectNode.set("child1", childNode); // 使用set方法给JsonNode添加子Node
objectNode.put("field1", "value1"); // 使用put方法给JsonNode添加字段
objectNode.remove("field1"); // 使用remove方法删除JsonNode某字段

1.3.5 循环JsonNode所有字段

Iterator<String> fieldNames = jsonNode.fieldNames(); // 创建Iterator遍历JsonNode字段
while(fieldNames.hasNext()) {String fieldName = fieldNames.next();JsonNode field = jsonNode.get(fieldName);
}

1.4 JsonParser类

1.5 JsonGenerator类

2 fastjson

3 Gson

相关文章:

Java处理JSON

Java处理json有很多种方法&#xff0c;在这里总结一下。 1 Jackson Spring MVC 默认采用Jackson解析Json&#xff0c;出于最小依赖的考虑&#xff0c;也许Json解析第一选择就应该是Jackson。 1.1 引入的包 Jackson核心模块由三部分组成&#xff1a;jackson-core、jackson-a…...

58-Map和Set练习-LeetCode692前k个高频单词

题目 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例 1&#xff1a; 输入: words ["i", "love", …...

线程生命周期及五种状态

文章目录一、线程生命周期及五种状态1、New(初始化状态)2、Runnable(就绪状态)3、Running(运行状态)4、Blocked(阻塞状态)5、Terminated&#xff08;终止状态&#xff09;二、线程基本方法1、线程等待&#xff08;wait&#xff09;2、线程睡眠&#xff08;sleep&#xff09;3、…...

OBCP第八章 OB运维、监控与异常处理-灾难恢复

灾难恢复是指当数据库中的数据在被有意或无意破坏后复原数据库所需要执行的活动 回收站&#xff1a;回收站在原理上说就是一个数据字典表&#xff0c;放置用户删除的数据库对象信息。用户删除的东西被放入回收站后&#xff0c;其实仍然占据着物理空间&#xff0c;除非您手动进…...

亚马逊云科技Serverless Data:数字经济下的创新动能

Serverless时代已经到来&#xff01;企业的技术架构&#xff0c;总是伴随着不断增长的数据与日趋复杂的业务持续演进。如何通过构建更易用的技术架构来聚焦在业务本身&#xff0c;而不必在底层基础设施的管理上投入过多的精力&#xff0c;是数据驱动型企业需要思考的重要议题。…...

【Ruby学习笔记】15.Ruby 异常

Ruby 异常 异常和执行总是被联系在一起。如果您打开一个不存在的文件&#xff0c;且没有恰当地处理这种情况&#xff0c;那么您的程序则被认为是低质量的。 如果异常发生&#xff0c;则程序停止。异常用于处理各种类型的错误&#xff0c;这些错误可能在程序执行期间发生&…...

聊聊MySQL主从延迟

文章目录 MySQL 的高可用是如何实现的呢?二、什么是主备延迟?三、主备延迟常见原因1、备库机器配置差2、备库干私活3、大事务四、主库不可用,主备切换有哪些策略?1、可靠优先2、可用优先实验一实验二3、结论MySQL 的高可用是如何实现的呢? 高可用性(high availability,缩…...

【C++从0到1】19、C++中多条件的if语句

C从0到1全系列教程 1、多条件的if语句 语法&#xff1a; if (表达式一) { // 表达式一为真时执行的语句。 } else if (表达式二) {// 表达式二为真时执行的语句。 } else if (表达式三) {// 表达式三为真时执行的语句。 } …… else if (表达式n) {// 表达式n为真时执行的语句。…...

【多微电网】计及碳排放的基于交替方向乘子法(ADMM)的多微网电能交互分布式运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Linux(centos7)安装防火墙firewalld及开放端口相关命令

安装firewalld 防火墙命令&#xff1a; yum install firewalld 安装完成&#xff0c;查看防火墙状态为 not running&#xff0c;即未运行&#xff0c;输入命令开启&#xff1a; 添加开放端口&#xff1a; 防火墙相关命令&#xff1a; 查看防火墙状态 systemctl status firewa…...

Linux部署.Net Core Web项目

本文主要记录我在Linux(Ubuntu)上部署.net core 的操作记录&#xff0c;也便于以后部署。 如对您有所帮助&#xff0c;不胜荣幸~ 文章目录前言一、准备工作1. 版本信息2. windows端web项目二、操作步骤1. Linux 配置 .net 运行环境1.1 查看最新 .net 运行环境的下载路径1.2 安装…...

【C++】STL之stack、queue的使用和模拟实现+优先级队列(附仿函数)+容器适配器详解

之前的一段时间&#xff0c;我们共同学习了STL中一些容器&#xff0c;如string、vector和list等等。本章我们将步入新阶段的学习——容器适配器。本章将详解stack、queue的使用和模拟实现优先级队列&#xff08;附仿函数&#xff09;容器适配器等。 目录 &#xff08;一&…...

第⑦讲:Ceph集群RGW对象存储核心概念及部署使用

文章目录1.RadosGW对象存储核心概念1.1.什么是RadosGW对象存储1.2.RGW对象存储架构1.3.RGW对象存储的特点1.4.对象存储中Bucket的特性1.4.不同接口类型的对象存储访问对比2.在集群中部署RadosGW对象存储组件2.1.部署RGW组件2.2.集群中部署完RGW组件后观察集群的信息状态2.3.修改…...

从异步到promise

一&#xff0c;背景 1.1&#xff0c;js的单线程 这一切&#xff0c;要从js诞生之初说起&#xff0c;因为js是单线程的语言。 js单线程原因&#xff1a;作为浏览器脚本语言&#xff0c;JavaScript的主要用途是与用户互动&#xff0c;以及操作DOM。这决定了它只能是单线程&…...

Linux系统中进行JDK环境的部署

一、为什么需要部署JDK。 JDK&#xff1a;Java Development Kit&#xff0c;是用于Java语言开发的环境。 部署JDK不需要懂得Java语言&#xff0c;只需要掌握Linux相关命令即可。 二、部署版本与环境。 系统&#xff1a;安装在VMware环境下的CentOS7.6&#xff1b; JDK版本&a…...

Leetcode.1033 移动石子直到连续

题目链接 Leetcode.1033 移动石子直到连续 Rating &#xff1a; 1421 题目描述 三枚石子放置在数轴上&#xff0c;位置分别为 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;你可以从两端之一拿起一枚石子&#xff08;位置最大或最小&#xff09;&#xff0c;并将其放入…...

【Java】在SpringBoot中使用事务注解(@Transactional)时需要注意的点

在SpringBoot中使用事务注解&#xff08;Transactional&#xff09;时需要注意的点Transactional是什么使用事务注解&#xff08;Transactional&#xff09;时需要注意的点Transactional是什么 Transactional是Spring框架提供的一个注解&#xff0c;用于声明事务边界和配置事务…...

找到序列最高位的1和最高位的0并输出位置

前言&#xff1a; 该题为睿思芯科笔试题&#xff0c;笔试时长20分钟。 题目描述 接口如下&#xff1a; module first_1_and_0#(parameter WIDTH 8 )(input [WIDTH-1:0] data_in ,input target ,output exist ,outpu…...

面试总结sdiugiho

一、进程与线程的区别 进程&#xff1a; 一个在内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff1b; windows 任务管理器中 一个 exe 就是一个进程。 线程&#xff1a; 进程中的一个执行任务&#xff08;控制…...

WIN10無法再使用 IE 瀏覽器打开网页解决办法

修改 Registry&#xff08;只適用 Win10&#xff09; 微軟已於 2023 年 2 月 14 日永久停用 Internet Explorer&#xff0c;會透過 Edge 的更新讓使用者開啟 IE 時自動導向 Edge&#xff0c;其餘如工作列上的圖示&#xff0c;使用的方法則是透過「品質更新」的 B 更新來達成&am…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...