JSON概念

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON 基于 JavaScript(ECMAScript(欧洲计算机协会制定的js规范)) 编程语言的一个子集,但它是一种独立于语言的数据格式,被广泛应用于各种编程语言和平台之间的数据交换。

JSON 的主要特点:

  • 轻量级: JSON 格式非常简洁,只包含必要的数据信息,减少了传输的数据量,提高了数据传输效率。
  • 易于阅读和编写: JSON 的结构清晰,使用键值对的方式组织数据,易于人理解和编写。
  • 易于解析和生成: 各种编程语言都提供了 JSON 解析器和生成器,方便程序处理 JSON 数据。
  • 跨平台、跨语言: JSON 是一种与编程语言无关的数据格式,可以在不同的平台和编程语言之间进行数据交换。
  • 数据结构: JSON 支持两种基本的数据结构:
    • 对象(Object): 由花括号 {} 包围,包含一系列键值对。键必须是字符串,值可以是基本数据类型(字符串、数字、布尔值、null)、数组或另一个 JSON 对象。
    • 数组(Array): 由方括号 [] 包围,包含一系列值。值可以是基本数据类型(字符串、数字、布尔值、null)、JSON 对象或另一个数组。

JSON 的数据类型:

  • 字符串(String): 用双引号 "" 包围的 Unicode 字符序列。
  • 数字(Number): 可以是整数或浮点数。
  • 布尔值(Boolean): truefalse
  • 空值(Null): null
  • 对象(Object): 键值对的集合。
  • 数组(Array): 值的有序列表。

语法:

  1. 数据在 键值对(Key/Value) 中

  2. 数据由逗号 , 分隔

  3. 对象⽤ {} 表⽰

  4. 数组⽤ [] 表⽰

  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

JSON 示例:

{"name": "张三","age": 30,"city": "北京","isStudent": false,"courses": ["语文", "数学", "英语"],"address": {"street": "XX大街","zipcode": "100000"}
}

如何与Java对象进行转化

ObjectMapper 是 Jackson 库中的一个核心类,主要用于在 Java 对象(POJO,Plain Old Java Object)和 JSON 数据之间进行转换。 简单来说,它能帮你把 JSON 字符串变成 Java 对象,也能把 Java 对象变成 JSON 字符串。

ObjectMapper 的主要功能:

  1. 序列化 (Serialization): 将 Java 对象转换为 JSON 字符串。 这个过程也称为 “marshalling”。
  2. 反序列化 (Deserialization): 将 JSON 字符串转换为 Java 对象。 这个过程也称为 “unmarshalling”。

为什么需要 ObjectMapper?

  • 简化 JSON 处理: 手动解析 JSON 字符串或手动构建 JSON 字符串非常繁琐且容易出错。 ObjectMapper 封装了这些复杂的操作,让你只需要调用几个简单的方法就能完成转换。
  • 类型安全: ObjectMapper 在转换过程中会进行类型检查,确保数据的正确性。 例如,如果你尝试将一个包含字符串的 JSON 字段反序列化为 Java 的 int 类型,ObjectMapper 会抛出异常。
  • 配置灵活: ObjectMapper 提供了丰富的配置选项,可以自定义 JSON 转换的行为,例如日期格式、字段命名策略、忽略未知字段等。

ObjectMapper 的常用方法:

  • writeValueAsString(Object value): 将 Java 对象转换为 JSON 字符串。

    ObjectMapper mapper = new ObjectMapper();
    MyObject obj = new MyObject("张三", 30);
    String jsonString = mapper.writeValueAsString(obj);
    System.out.println(jsonString); // 输出: {"name":"张三","age":30}
    
  • readValue(String content, Class<T> valueType): 将 JSON 字符串转换为 Java 对象。

    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"name\":\"李四\",\"age\":25}";
    MyObject obj = mapper.readValue(jsonString, MyObject.class);
    System.out.println(obj.getName()); // 输出: 李四
    System.out.println(obj.getAge());  // 输出: 25
    

易错点:
·readValue(String content, TypeReference<T> valueTypeRef): 将 JSON 字符串转换为复杂的泛型类型(如 List 或 Map<K, V>)。

当你需要将一个 JSON 数组转换为 Java 的 List 集合时,你需要使用 TypeReference 来帮助 Jackson 保留泛型信息。

ObjectMapper mapper = new ObjectMapper();
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30}, {\"name\":\"李四\",\"age\":25}]";// 错误的做法:mapper.readValue(jsonArrayString, List.class);
// 这会导致 List 中的元素被解析为 LinkedHashMap,而不是 MyObject// 正确的做法:使用 TypeReference
List<MyObject> userList = mapper.readValue(jsonArrayString, new TypeReference<List<MyObject>>() {});System.out.println(userList.get(0).getName()); // 输出: 张三
  • readTree(String content): 将 JSON 字符串转换为 JsonNode 对象。 JsonNode 是 Jackson 库中表示 JSON 树结构的类,可以方便地访问 JSON 数据的各个部分。

    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"name\":\"王五\",\"age\":40}";
    JsonNode rootNode = mapper.readTree(jsonString);
    String name = rootNode.get("name").asText();
    int age = rootNode.get("age").asInt();
    System.out.println(name); // 输出: 王五
    System.out.println(age);  // 输出: 40
    

使用 ObjectMapper 的步骤:

  1. 添加 Jackson 依赖: 在你的项目中添加 Jackson 库的依赖。 如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖:(如果是Springboot项目那么其已经内置了,不需要再导入)

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.16.1</version>  <!-- 使用最新版本 -->
    </dependency>
    
  2. 创建 ObjectMapper 对象

  • 普通项目

    ObjectMapper mapper = new ObjectMapper();
    
  • SpringBoot项目

    • 正如前文所说,Spring Boot 已经为我们自动配置了一个 ObjectMapper Bean。因此,在 Spring Boot 项目中,我们不应该手动 new ObjectMapper(),而应该通过依赖注入(DI)来使用这个已经配置好的单例对象。
@Service
public class MyService {private final ObjectMapper objectMapper;// 通过构造函数注入(推荐)@Autowiredpublic MyService(ObjectMapper objectMapper) {this.objectMapper = objectMapper;}public void doSomething() {// 直接使用注入的 objectMapper 实例// ...}
}
  1. 调用 ObjectMapper 的方法进行 JSON 转换: 使用 writeValueAsString() 进行序列化,使用 readValue()readTree() 进行反序列化。

ObjectMapper 的高级用法:

  • 自定义序列化器和反序列化器: 可以自定义 JsonSerializerJsonDeserializer 来控制 JSON 转换的细节。
  • 使用注解: 可以使用 Jackson 提供的注解 (例如 @JsonProperty, @JsonIgnore, @JsonFormat) 来配置 JSON 转换的行为。
    • @JsonProperty("user_name"): 用于指定 Java 属性在 JSON 中对应的键名,常用于连接不同的命名风格(如 Java 的驼峰 userName 和 JSON 的下划线 user_name)。
    • @JsonIgnore: 在序列化和反序列化时完全忽略某个属性。
    • @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"): 用于指定 Date 或 LocalDateTime 等日期类型的格式。
  • 配置 ObjectMapper: 可以通过 ObjectMapper 的配置方法 (例如 configure(), setPropertyNamingStrategy()) 来调整 JSON 转换的各种参数。

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

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

相关文章

从零开始的云计算生活——第三十六天,山雨欲来,Ansible入门

目录 一.故事背景 二.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 三.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程&#xff08;重要&#xff09; 四.Ansible配置解析 ansible的安装方式 ansible的程序结…

【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

线性代数 下

文章目录十一、方程组解的结构和性质1、齐次线性方程组2、非齐次线性方程组十二、Ax0的基础解系十三、两个方程组的公共解十四、同解方程十五、求特征值、特征向量十六、判断A能否相似对角化十七、若A可以相似对角化&#xff0c;求P(Q)十八、二次型化标准型1、拉格朗日配方法2、…

Go语言实战案例-自定义队列结构

以下是《Go语言100个实战案例》中的 数据结构与算法篇 - 案例24&#xff1a;自定义队列结构 的完整内容&#xff0c;帮助初学者通过自定义结构体来实现队列的数据结构。&#x1f3af; 案例目标实现一个自定义的队列结构&#xff0c;并提供常见的队列操作&#xff1a;入队&#…

Windows-WSL-Docker端口开放

本文介绍如何在局域网内访问Windows服务器端口&#xff0c;特别是针对已安装WSL环境并在其中运行Docker服务的情况。主要解决Docker服务向局域网开放端口的配置问题步骤一&#xff1a;配置转发当你的应用程运行在WSL中时&#xff0c;需要执行此步骤。在宿主机&#xff08;windo…

面试知识梳理-vue3和vue2区别

vue3相对于vue2的优势 性能更好体积更小更好的ts支持&#xff08;vue3 ts开发&#xff09;更好的代码组织更好的逻辑抽离更多新功能&#xff08;vue2其实也都能自己做出来&#xff09; 更好的代码组织 Composition API 的革新 Vue 2 采用 ​​Options API​​&#xff0c;通过 …

栈的核心原理

1 栈的概念及结构栈是一种特殊的线性表&#xff0c;其特点是只允许在固定的一端进行插入和删除操作。进行操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09; 原则。压\入\进栈&#xff08;Push…

【无标题】暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。

暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。暗物质的拓扑本质 1. 跨桥零模振动理论 暗物质对应跨桥结构的基态振动模&#xff1a; math \phi_{\text{DM}} \frac{1}{\sqrt{6}} \sum_{f1}^6 \mathcal{B}_f^{(0)} $$ 其中 $\mathcal{B}…

【接口自动化】-1- 初识接口

一、什么是接口 接口涉及到四个实体&#xff1a;&#xff08;我去饭店点餐&#xff09; 我是客人 &#xff1a;客户端 厨师&#xff1a;服务器 服务员&#xff1a;接口 菜单&#xff1a;接口文档 接口定义了一套信息规则让两个系统之间互相不必知道对方的内部&#xff0c…

华为FTTR光猫V173 F30改公开版界面 附带真正的s161补全一体固件

【本文介绍】 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 这款FTTR的V173 F30看着颜值很高 也很实用 毕竟是XGPON万兆的光猫…

【学习】数字化车间与智能工厂如何推进制造业转型

在制造业转型升级的浪潮中&#xff0c;数字化车间与智能工厂已成为推动产业变革的核心引擎。前者通过物联网、大数据与自动化技术的深度融合&#xff0c;实现生产流程的精细化管控与资源优化&#xff1b;后者则依托人工智能、5G通信与数字孪生技术&#xff0c;构建起具备自感知…

HTML元素与高级功能完全教程:从基础到精通

目录 章节1:HTML的灵魂——元素的本质与结构化思维 1.1 元素的核心:标签、属性与内容 1.2 语义化的革命 1.3 常见的“坑”与避坑指南 章节2:表单元素:打造交互的基石 2.1 表单基础:与核心控件 2.2 高级输入类型与验证 2.3 表单的可访问性与用户体验 章节3:HTML5多媒…

IP证书:构建数字世界知识产权安全防线的基石

引言 在数字化浪潮席卷全球的今天&#xff0c;知识产权&#xff08;IP&#xff09;的保护已成为企业、机构乃至个人面临的重要挑战。无论是商业秘密、专利技术&#xff0c;还是数字版权&#xff0c;其安全性和可信度都直接影响着创新生态的健康发展。而作为数字安全的核心工具…

CAD插件『PDF转CAD格式』安装教程

在工程设计领域&#xff0c;常规流程是将完成的CAD图纸直接转换为PDF格式或输出为纸质蓝图进行分发。由于PDF文件具有跨平台兼容性强、防篡改等特性&#xff0c;在工程交付环节被广泛采用。但当需要对既有图纸进行二次修改时&#xff0c;PDF格式的编辑局限性便凸显出来&#xf…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)

目录 1、题目 2、解答 一、信号追踪法&#xff08;Signal Tracing&#xff09; 原理 操作步骤 应用场景 二、替换法&#xff08;Replacement Method&#xff09; 原理 操作要点 应用场景 三、分段调试法&#xff08;Segmented Debugging&#xff09; 原理 操作步骤…

Qt中QObject类的核心作用与使用

一、QObject类简介 各位小伙伴&#xff0c;在Qt的世界里&#xff0c;QObject类就像是"万物之母"&#xff0c;它是Qt对象模型的核心基类。几乎所有的Qt类都直接或间接地继承自QObject。QObject提供了很多重要的功能&#xff0c;比如对象树管理、信号与槽机制、元对象系…

TVBOXOS6.0双端APP二开源码完整版全开源源码重构版

今天介绍的TVBOXOS手机版App源码采用了纯64位的前端架构&#xff0c;版本则基于本站修正过的6.0前端进行构建。经过多次优化&#xff0c;这款应用不仅操作流畅&#xff0c;界面设计也颇具美感。前端完全集成了安卓原生Java架构&#xff0c;而后端管理采用的是PHP的如意系统。前…

VoWiFi技术深度解析:架构、流程与演进

在蜂窝网络覆盖盲区实现高清语音通话的秘密,就藏在这套基于IMS的Wi-Fi呼叫系统中 一、VoWiFi概述与技术价值 VoWiFi(Voice over Wi-Fi)是一种基于IMS核心网的语音通信技术,允许用户通过Wi-Fi接入运营商的EPC(演进分组核心网)和IMS系统,实现与传统蜂窝网络无缝集成的语音…

DuoPlus云手机再上新:统一配置品牌型号、代理分组与便捷搜索功能全面提升!

前言&#xff1a;在这个日新月异的时代&#xff0c;每一个微小的变化都可能引领行业新潮流&#xff0c;DuoPlus云手机基于不断创新的原则&#xff0c;把用户的需求放在第一位&#xff0c;不断对产品进行调整优化&#xff0c;致力于给用户最全面的产品体验。DuoPlus通过收集用户…

C/C++内存陷阱:为何返回局部变量地址是“定时炸弹”?

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在编程世界里,有些错误就像是隐藏在代码里的“定时炸弹”,平时可能相安无事,但在某个不经意的时刻就会引爆,导致程序崩溃或出现无法解释的诡异行为。今天,我们要拆解的,就是这样一个极具迷惑性又极其危险的…