JSON 基本语法以及在Java 中的使用

文章目录

  • 一、JSON 概述
    • 1.1 什么是 JSON
    • 1.2 JSON数据类型和语法
    • 1.3 JSON 优势
  • 二、使用 JSON
    • 2.1 在 Java程序中使用 JSON
    • 2.2 Jackson的使用
      • 2.2.1 Jackson的简单介绍
      • 2.2.2 反序列化
      • 2.2.3 序列化
  • 参考资料

一、JSON 概述

1.1 什么是 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交互格式。它去除了所有 JavaScript 执行代码,只保留 JavaScript 的对象格式。

它基于 ECMAScript (欧洲计算机协会制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

1.2 JSON数据类型和语法

JSON适合表示层次结构,JSON采用键值对的方式来组织数据,仅支持以下几种数据类型:

  • 键值对:{"key": value}
  • 数组:[1, 2, 3]
  • 字符串:"abc"
  • 数值(整数和浮点数):12.34
  • 布尔值:truefalse
  • 空值:null

JSON的语法主要包含以下几点

  • JSON数据以键值对形式存在,键值对的键和值之间用冒号 : 连接。不同键值对之间用逗号 , 隔开,

  • JSON只允许使用双引号包裹 key, 特殊字符用 \ 转义,

  • {} 用于表示 JSON对象,也称为键值对(key-value pairs)的集合,对应 js 中的 object 。

  • [] 用于表示 JSON数组,也称为值的有序列表,对应 js 中的 array。数组中的元素可以是字符串、数字、布尔值、对象、数组或者 null

JSON格式的例子:

{"name": "John Doe","age": 30,"city": "New York","isStudent": false,"hobbies": ["reading", "traveling", "coding"],"address": {"street": "123 Main Street","zipCode": "10001"}
}

1.3 JSON 优势

JSON(JavaScript Object Notation)作为一种数据交换格式,具有多个优点,使其在各种应用中得到广泛使用:

  • 轻量级: JSON 是一种轻量级的数据交换格式,相对于其他格式如 XML,它的数据量较小。这有助于减少网络传输的数据量,提高传输效率。

  • 易于解析和生成: JSON 数据易于在不同的编程语言中解析和生成。几乎所有的编程语言都提供了 JSON 解析器和生成器,使得在应用程序中处理 JSON 数据变得方便。

    js中,json与对象的转换:JSON.parse()/JSON.stringify();
    php中,json与数组的转换:json_encode()/json_decode();
    java中,json与对象的转换:fromJson()/toJson();
    python中,json与对象的转换:json.dumps()/json.loads();

  • 与多种平台和语言兼容: JSON 不依赖于任何特定的编程语言,可以在不同平台和各种编程语言之间进行数据交换。这使得 JSON 成为跨平台和跨语言的数据传输格式。

  • 浏览器原生支持: 在前端开发中,JSON 在 JavaScript 中具有原生支持,可以直接在浏览器中解析和生成 JSON 数据,使得前后端数据交互更加方便。

    // JSON string to JavaScript object:
    jsObj = JSON.parse(jsonStr);// JavaScript object to JSON string:
    jsonStr = JSON.stringify(jsObj);
    

二、使用 JSON

2.1 在 Java程序中使用 JSON

在 Java 中,我们通常使用一些库来处理 JSON 数据,实现 JavaBean和 JSON 之间的转换。这些库主要有:

  • Jackson
  • Gson
  • Fastjson

在 JavaBean和 JSON 之间的转换过程里,主要有两个概念:

  • 序列化: 将 JavaBean变为 JSON 对象
  • 反序列化: 将 JSON对象 解析为 JavaBean

具体地说,反序列化的过程包括以下步骤:

  1. 获取JSON数据: 从外部来源(例如网络、文件或其他应用程序)获取包含JSON数据的字符串。
  2. 反序列化操作: 使用相应的JSON解析库或框架,将JSON数据解析为 Java 对象。在Java中,常见的JSON解析库包括Jackson、Gson、org.JSON等。
  3. 生成Java对象: 解析后,将 JSON 数据映射到 Java对象的属性上,从而创建一个对应的 Java 对象。

在 Jackson 库中,将 JSON 数据映射到 Java 对象的属性是通过 Java 对象的 Getter 和 Setter 方法以及字段的匹配来完成的。以下是映射的基本规则:

  1. 属性名匹配: JSON中的字段名需要与 Java对象的属性名一致。例如,如果JSON中有一个字段名为 "id",则对应的Java对象需要有一个名为 id 的属性,并且Jackson库会通过调用 getId()setId() 方法来映射该属性。
  2. 驼峰命名规则: 如果JSON中的字段名采用驼峰命名(例如 "myField"),Jackson库会自动匹配到Java对象的驼峰命名风格的属性(例如 getMyField()setMyField() 方法)。
  3. 类型匹配: Jackson会尽量将JSON中的值转换为Java对象相应属性的类型。例如,如果JSON中的 "age" 字段是一个整数,Jackson会尝试将其转换为Java对象的 int 类型属性。
  4. 嵌套对象: 如果JSON中包含嵌套的对象,Jackson会递归地将这些嵌套对象映射到Java对象的嵌套属性中。
  5. 默认构造函数: Java对象需要具有默认构造函数(无参数的构造函数)。这是因为Jackson在映射时会创建Java对象的实例,然后通过Setter方法设置属性的值。

2.2 Jackson的使用

2.2.1 Jackson的简单介绍

Jackson 是一个用于 Java 平台的 JSON 处理库,主要用于 JSON 数据的序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)。 Jackson是一个广泛使用且功能强大的库, 可以与 Spring 框架无缝集成,是 Spring MVC 默认的 JSON 处理库

ObjectMapper 类是Jackson库的核心类,提供两种方法:

  • readValue 方法被用于将JSON字符串解析为 JavaBean 对象,可以接受不同类型的输入,包括 JSON 字符串、JSON 输入流等。例如

    ObjectMapper objectMapper = new ObjectMapper();
    String jsonString = "{ \"id\": 1, \"name\": \"John\" }";
    User user = objectMapper.readValue(jsonString, User.class);
    
  • writeValueAsString 方法用于将 Java 对象序列化为 JSON 数据字符串。该方法接受一个 Java 对象,并返回其对应的 JSON 字符串。例如:

    ObjectMapper objectMapper = new ObjectMapper();
    User user = new User(1, "John");
    String jsonString = objectMapper.writeValueAsString(user);
    

另外,我们还可以可以自定义JsonSerializerJsonDeserializer来定制序列化和反序列化

2.2.2 反序列化

假设有一个JSON字符串表示一个用户信息,如下所示:

{"id": 1,"username": "john_doe","email": "john@example.com","age": 30,"active": true
}

存在 User 类,如下所示:

@Data
public class User {private long id;private String username;private String email;private int age;private boolean active;// Default constructor (required for Jackson)public User() {}// Parameterized constructorpublic User(long id, String username, String email, int age, boolean active) {this.id = id;this.username = username;this.email = email;this.age = age;this.active = active;}

我们将使用 Jackson 库进行 JSON 解析。首先,确保已经将 Jackson 库添加到项目的依赖中。接下来,使用以下代码将 JSON 字符串解析为Java对象:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonExample {public static void main(String[] args) {// JSON字符串String jsonString = "{ \"id\": 1, \"username\": \"john_doe\", \"email\": \"john@example.com\", \"age\": 30, \"active\": true }";// 创建ObjectMapper对象ObjectMapper objectMapper = new ObjectMapper();try {// 将JSON字符串解析为User对象User user = objectMapper.readValue(jsonString, User.class);// 使用解析得到的User对象System.out.println("ID: " + user.getId());System.out.println("Username: " + user.getUsername());System.out.println("Email: " + user.getEmail());System.out.println("Age: " + user.getAge());System.out.println("Active: " + user.isActive());} catch (Exception e) {e.printStackTrace();}}
}

在这个例子中,User 类是一个简单的Java类,用于表示用户信息。ObjectMapper 类是Jackson库的核心类,它提供了方法来解析JSON字符串并将其转换为Java对象。这个例子中,readValue 方法被用于将JSON字符串解析为User对象。

请注意,User类应该具有与JSON属性相对应的Setter方法,以便ObjectMapper能够Java对象的实例,然后通过Setter方法设置属性的值

2.2.3 序列化

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonSerializationExample {public static void main(String[] args) {// 创建一个User对象User user = new User(1, "john_doe", "john@example.com", 30, true);// 创建ObjectMapper对象ObjectMapper objectMapper = new ObjectMapper();try {// 将User对象转换为JSON字符串String jsonString = objectMapper.writeValueAsString(user);// 打印JSON字符串System.out.println("JSON String: " + jsonString);} catch (Exception e) {e.printStackTrace();}}
}

在这个例子中,我们创建了一个User对象,然后使用ObjectMapperwriteValueAsString方法将其转换为JSON字符串。writeValueAsString方法将Java对象转换为JSON字符串,这样我们就可以在需要时将其传递给其他系统、写入文件或发送到网络。

请注意,User类应该具有与JSON属性相对应的Getter方法,以便ObjectMapper能够访问并获取Java对象的属性值

参考资料

GitHub - FasterXML/jackson: Main Portal page for the Jackson project

Jackson Tutorial | Baeldung(推荐)

使用JSON - 廖雪峰的官方网站 (liaoxuefeng.com)

什么是JSON - 知乎 (zhihu.com)

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

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

相关文章

Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案

2018年,我们开始在原生RTSP|RTMP直播播放器的基础上,对接了Unity环境下的低延迟播放,毫秒级延迟,发布后,就得到了业内一致的认可。然后我们覆盖了Windows、Android、iOS、Linux的RTMP推送、轻量级RTSP服务和RTSP|RTMP播…

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…

ctfshow信息收集(web1-web20)

目录 web1 web2 web3 web4 web5 web6 web7 web9 web10 web11 web14 web15 web16 web17 web18 web19 web20 web1 根据提示的孩子开发的时候注释没有被及时删除 web2 js原因无法查看源代码 第一种方法 在url前加入 view-source: 会显示页面源代…

【车载HMI开发工具--EB GUIDE 与 Unity 合作提供一体化的沉浸式 HMI 设计开发工具链】【转载】

随着车载高性能计算平台的日益普及以及显示器尺寸和数量的不断增加,沉浸式车载人机交互界面(HMI)的需求也在持续增长。为了将实时 3D 技术带入车载 HMI 领域,Unity 与 Elektrobit (EB)展开了合作,EB 是推进 HMI 功能安…

数据分析完整流程一般包括哪几个环节/步骤

问题定义: 确定需要解决的问题或目标,明确分析的方向和目的。 数据收集: 收集与问题相关的数据,可以包括从各种来源获取的结构化或非结构化数据。 数据清洗: 对收集到的数据进行清理,处理缺失值、异常值和…

JavaScript 中的事件

1、鼠标事件&#xff1a; 鼠标单击事件&#xff08;click&#xff09;&#xff1a; 方法一 &#xff08;onclick&#xff09; <button id"btn" onclick"alert(88888)">点击弹框</button> 方法二&#xff08;利用addEventListener&#xff09;…

洛谷(CodeForces)历年愚人节题目,难度普及+/提高,让你怀疑自己智商

INTERCALC 题目描述 DO YOU EXPECT ME TO FIND THIS OUT? WHAT BASE AND/XOR LANGUAGE INCLUDES string? DON’T BYTE OF MORE THAN YOU CAN CHEW YOU CAN ONLY DISTORT THE LARGEST OF MATHEMATICS SO FAR SAYING “ABRACADABRA” WITHOUT A MAGIC AND WON’T DO YOU …

ssh: connect to host github.com port 22: Connection timed out

问题描述 本来好好的git push到GitHub突然有一天会卡住&#xff0c;不报错也不提示超时。 查了各种办法&#xff1a; 从ssh改成https&#xff0c;然后发现2021年8月好像停用了https的访问方式&#xff0c;需要生成口令&#xff0c;感觉太麻烦和奇怪就没有解决了。git remote…

Webpack5入门到原理21:提升开发体验

SourceMap 为什么 开发时我们运行的代码是经过 webpack 编译后的&#xff0c;例如下面这个样子&#xff1a; /** ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").* This devtool is neither made for product…

更新Ubuntu并同步网络时间

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间 文章目录 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间1.更新Ubuntu1.1 查看ubuntu版本和详细信息1.2 创建root用户1.3 更…

Webpack5入门到原理19:React 脚手架搭建

开发模式配置 // webpack.dev.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin"); const ReactRefreshWebpackPlugin require("…

使用 ImportBeanDefinitionRegistrar 向Spring容器中注入Bean

目录 一、如何使用二、优点 一、如何使用 ImportBeanDefinitionRegistrar是Spring提供的一个接口&#xff0c;允许你在运行时动态地注册Bean定义到Spring容器中。通过实现这个接口&#xff0c;你可以在配置类上使用Import注解&#xff0c;并在registerBeanDefinitions方法中自…

蓝桥杯练习题(十二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;十二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他…

黑马程序员-瑞吉外卖-day4

实现账号的启动禁止 EmployeeController PutMappingpublic R<String> update(RequestBody Employee employee){employeeService.updateById(employee);return R.success("员工信息修改成功");} 出错 解决 common目录下 引入JacksonObjectMapper package com…

AI绘画Stable Diffusion进阶使用

本文讲解&#xff0c;模型底模&#xff0c;VAE美化模型&#xff0c;Lora模型&#xff0c;hypernetwork。 文本Stable Diffusion 简称sd 欢迎关注 使用模型 C站&#xff1a;https://civitai.com/ huggingface&#xff1a;https://huggingface.co/models?pipeline_tagtext-to-…

怎么移除WordPress后台工具栏的查看站点子菜单?如何改为一级菜单?

默认情况下&#xff0c;我们在WordPress后台想要访问前端网站&#xff0c;需要将鼠标移动到左上角的站点名称&#xff0c;然后点击下拉菜单中的“查看站点”才行&#xff0c;而且还不是新窗口打开。那么有没有办法将这个“查看站点”子菜单变成一级菜单并显示在顶部管理工具栏中…

Vulnhub靶机:FunBox 2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 2&#xff08;10.0.2.27&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/funbo…

基于Servlet建立表白墙网站

目录 一、设计思想 二、设计表白墙页面&#xff08;前端--VSCode&#xff09; 1、效果图 2、html部分&#xff08;网页上有哪些内容&#xff09; 3、css部分&#xff08;页面内容的具体样式&#xff09; 4、js部分&#xff08;页面行为&#xff09; 三、借助Servlet实现客…

TCP服务器最多支持多少客户端连接

目录 一、理论数值 二、实际部署 参考 一、理论数值 首先知道一个基础概念&#xff0c;对于一个 TCP 连接可以使用四元组&#xff08;src_ip, src_port, dst_ip, dst_port&#xff09;进行唯一标识。因为服务端 IP 和 Port 是固定的&#xff08;如下图中的bind阶段&#xff0…

Python(18)--文件输入/输出 Ⅱ

​ 大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 前一篇文章&#xff08;python(17)–文件的输入/输出-CSDN博客&#xff09;介绍了如何操作文本文件和二进制文件&#xff0c;以及对应…