当前位置: 首页 > 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…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...