JSON、JSONObject、JSONArray详细介绍及其应用方式

第一部分:什么是JSON?

🌟比喻:JSON 是「快递公司统一的 “通用快递单”」

💡场景代入

你想给朋友寄生日礼物(比如一台 “游戏机”),这台游戏机有自己的属性:

  • 名称:"游戏机"
  • 价格:2000
  • 配件:["手柄", "充电线"]

但直接把 “游戏机”(代码里的对象,比如 Java 的 Game 类、Python 的 dict)寄过去,会有问题:

朋友用的 “收货系统”(另一种编程语言),看不懂你家 “游戏机对象” 的特殊格式(比如 Java 里的 private 修饰符,Python 不认识 )。

这时候,JSON 就像 “通用快递单” ,帮你把 “游戏机” 的信息,转换成 全世界快递员都能看懂的格式

{"name": "游戏机","price": 2000,"accessories": ["手柄", "充电线"]
}
💡核心作用

让不同系统 / 语言能 “读懂” 数据,像通用快递单,全世界物流都认。这个在项目里面调用第三方接口尤为常见:项目里调用第三方接口时 ,就像你和外国公司合作:你说中文,对方说英文,JSON 就是 "翻译文件",让两边能顺利传数据、做交易~

第二部分:什么是JSONObject?

🌟比喻:JSONObject 是「帮你填 “通用快递单” 的 “智能填单工具”」

💡场景代入

虽然知道 JSON 是 “通用快递单”,但手动写快递单(拼 JSON 字符串)容易出错:

  • 忘记加双引号(比如把 "name" 写成 name
  • 少打逗号(比如 ["手柄" "充电线"] ,中间没逗号)

这时候,JSONObject 就像手机里的 “智能填单 APP”

  • 你在 APP 里选 “商品类型”(比如选 “游戏机”),填 “名称、价格、配件”,APP 会 自动按 JSON 规则生成标准快递单(帮你加双引号、逗号,规范格式)。
💡具体解释(用代码类比)
  • 在 Java 里,你可以用 JSONObject 类(比如 org.json.JSONObject 库),像这样写:
// 1. 创建一个“填单工具”(JSONObject)
JSONObject jsonObj = new JSONObject();  
// 2. 填信息(自动按 JSON 规则处理)
jsonObj.put("name", "游戏机");   // 键自动加双引号
jsonObj.put("price", 2000);     // 值是数字,规范格式
jsonObj.put("accessories", new JSONArray("[\"手柄\", \"充电线\"]")); // 嵌套数组  // 3. 生成标准 JSON 快递单(字符串)
String jsonString = jsonObj.toString();  
// 输出:{"name":"游戏机","price":2000,"accessories":["手柄","充电线"]}
💡核心作用

帮你在代码里 “安全、规范地拼 JSON” ,避免手动写字符串出错,就像填单 APP 自动检查格式,保证快递单能被全世界认可!

第三部分:JSON vs JSONObject对比

第四部分:JSON的数据类型

✨先总览一下全部的数据类型,然后下面超详细讲解 JSON 的 6 种数据类型,结合通俗易懂的例子帮助理解~

1. 基本数据类型(4 种)

a. 字符串(String)
  • 定义:由双引号 "" 包裹的字符序列,可包含字母、数字、符号等。
  • 注意:必须用双引号(单引号不合法),支持转义字符(如 \n 换行、\" 表示双引号)
{"name": "张三",  // 中文字符串"message": "Hello \"World\"",  // 包含转义的双引号"path": "C:\\Users\\file.txt"  // 转义反斜杠(Windows路径)
}
b. 数字(Number)
  • 定义:整数或浮点数,支持正负、小数、指数形式(如 eE 表示科学计数法)。
  • 注意:不能包含逗号(如 1,000 不合法),没有八进制、十六进制表示(只能十进制)。
{"age": 25,  // 整数"height": 1.75,  // 浮点数"temperature": -5.2,  // 负数"distance": 3.6e5  // 科学计数法(3.6×10⁵ = 360000)
}
c. 布尔值(Boolean)
  • 定义:只有两个可能的值:true(真)或 false(假),用于表示逻辑状态。
  • 注意:必须小写(TrueFALSE 不合法)。
{"isStudent": true,"hasGraduated": false
}
d. 空值(Null)
  • 定义:表示 “无值” 或 “缺失值”,仅用 null 表示。
  • 注意:必须小写(NullNULL 不合法),用于明确表示某个键不存在值(区别于空字符串 "")。
{"middleName": null,  // 没有中间名"lastLogin": null  // 从未登录过
}

2. 复合数据类型(2 种)

a. 对象(Object)
  • 定义:由花括号 {} 包裹的键值对集合,键是字符串(必须用双引号),值可以是任意 JSON 数据类型(包括对象自身,支持嵌套)。
  • 结构:键和值之间用 : 分隔,键值对之间用 , 分隔(最后一个键值对后不能有逗号)。
{"user": {  // 嵌套对象"name": "李四","age": 30,"contact": {  // 多层嵌套"phone": "123456789","email": "lisi@example.com"}}
}
b. 数组(Array)
  • 定义:由方括号 [] 包裹的有序值集合,值可以是任意 JSON 数据类型(包括数组自身,支持嵌套),元素之间用 , 分隔(最后一个元素后不能有逗号)。
  • 特点:数组是有序的(通过索引访问),元素类型可以不同(如同时包含数字、字符串、对象等)。
{"hobbies": ["读书", "跑步", "编程"],  // 字符串数组"scores": [90, 85.5, null],  // 混合类型数组(数字、空值)"students": [  // 对象数组{"name": "王五", "age": 20},{"name": "赵六", "age": 22}],"matrix": [[1, 2], [3, 4]]  // 嵌套数组(二维数组)
}

第五部分:JSONObject的使用

1. 创建 JSONObject

方式 1:空对象初始化,再逐个添加键值

import org.json.JSONObject;public class JsonDemo {public static void main(String[] args) {JSONObject userObj = new JSONObject();userObj.put("name", "张三");  // 存字符串userObj.put("age", 25);       // 存数字userObj.put("isStudent", true); // 存布尔值userObj.put("hobbies", new JSONArray("[\"篮球\",\"音乐\"]")); // 存 JSON 数组(后面讲 JSONArray 会细拆)System.out.println(userObj);// 输出:{"name":"张三","age":25,"isStudent":true,"hobbies":["篮球","音乐"]}}
}

方式 2:用 Map 初始化(适合已有 Map 结构)

import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;public class JsonDemo {public static void main(String[] args) {Map<String, Object> dataMap = new HashMap<>();dataMap.put("city", "北京");dataMap.put("population", 2184); // 简单数字示例,实际是千万级,这里简化JSONObject cityObj = new JSONObject(dataMap);System.out.println(cityObj);// 输出:{"city":"北京","population":2184}}
}

方式 3:直接解析 JSON 字符串

如果有现成 JSON 字符串,可直接转 JSONObject

import org.json.JSONObject;public class JsonDemo {public static void main(String[] args) {String jsonStr = "{\"name\":\"李四\",\"gender\":\"男\"}";JSONObject obj = new JSONObject(jsonStr);System.out.println("解析后的姓名:" + obj.getString("name"));// 输出:解析后的姓名:李四}
}
2. 读取 JSONObject 的值

支持按类型精准获取(避免强制类型转换报错),常用方法:

  • getString("key"):取字符串值
  • getInt("key"):取 int 数值
  • getBoolean("key"):取布尔值
  • getJSONObject("key"):取嵌套的 JSONObject
  • getJSONArray("key"):取嵌套的 JSONArray

示例:基于前面创建的 userObj 演示读取

// 延续前面 userObj 的代码
String name = userObj.getString("name"); 
int age = userObj.getInt("age");
boolean isStudent = userObj.getBoolean("isStudent");
JSONArray hobbies = userObj.getJSONArray("hobbies");System.out.println("姓名:" + name);      // 输出:姓名:张三
System.out.println("年龄:" + age);        // 输出:年龄:25
System.out.println("是否学生:" + isStudent); // 输出:是否学生:true
System.out.println("爱好列表:" + hobbies);  // 输出:爱好列表:["篮球","音乐"]
3. 修改 JSONObject 的值

put("key", 新值) 覆盖已有键的值,或新增键值对:

// 延续 userObj
userObj.put("age", 26); // 修改 age 的值
userObj.put("email", "zhangsan@example.com"); // 新增 email 键值
System.out.println(userObj);
// 输出:{"name":"张三","age":26,"isStudent":true,"hobbies":["篮球","音乐"],"email":"zhangsan@example.com"}
4. 删除 JSONObject 的键

remove("key") 移除指定键:

userObj.remove("isStudent");
System.out.println(userObj);
// 输出:{"name":"张三","age":26,"hobbies":["篮球","音乐"],"email":"zhangsan@example.com"}
5. 嵌套 JSONObject 处理(重点场景)

实际 JSON 常嵌套多层,比如 “用户信息里包含地址对象”:

JSONObject address = new JSONObject();
address.put("province", "广东");
address.put("city", "深圳");JSONObject nestedObj = new JSONObject();
nestedObj.put("name", "王五");
nestedObj.put("address", address); // 把 address 作为嵌套对象存入System.out.println(nestedObj);
// 输出:{"name":"王五","address":{"province":"广东","city":"深圳"}}// 读取嵌套对象的值
JSONObject innerAddr = nestedObj.getJSONObject("address");
System.out.println("所在省份:" + innerAddr.getString("province"));
// 输出:所在省份:广东

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

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

相关文章

Linux系统编程--权限管理

权限管理第二讲 权限管理1. Shell命令以及运行原理1.1 知识引入1.2 概念介绍1.3 具体示例2. Linux权限问题2.1 权限概念2.2 用户分类2.3 切换用户2.4 用户提权2.5 文件权限管理2.5.1 文件访问者的分类&#xff08;角色&#xff09;2.5.2 文件类型和访问权限&#xff08;事物属性…

【智能硬件】X86和ARM架构的区别

详细解释X86架构和ARM架构之间的区别以及它们各自的特点。X86 架构定义与历史定义&#xff1a;X86是一种计算机处理器体系结构&#xff0c;最初由英特尔公司开发。它是一系列指令集的集合体。历史&#xff1a;最早的X86架构是Intel 8086处理器&#xff0c;在1978年发布。后续发…

玳瑁的嵌入式日记D13-0806(C语言)

指针1.指针指针 就是地址(地址就是内存单元的编号)指针变量 (结合语境) eg&#xff1a;定义一个指针指针这一类数据 --- 数据类型 --- 指针类型 (1).指针 是什么 (2).指针类型 int a; //int数据类型 a是int型变量 //a的空间 想来存储 整型数据 2.指针的定义 基类型 * 指针变量名…

密码学基础知识总结

密码学基础知识总结 一、Base编码 1. Base系列特征 编码类型字符集特征Base160-9, A-F密文长度偶数Base32A-Z, 2-7包含数字2-7Base64a-z,0-9,,/,密文长度是8的倍数Base36A-Z,0-9仅支持整数加密Base910-9,a-z,A-Z,特殊符号高密度编码Base100Emoji表情表情符号组成 2. 典型题型…

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结 以下是针对 PostgreSQL 中 pg_wal 文件过多过大的清理方法及关键注意事项的总结 一、安全清理 WAL 文件的完整流程 1. 确认数据库和备份完整性 备份验证&#xff1a;确保最近的物理备份&#xff08;如 pg_base…

Django事务支持

1.事务概念 事务是一组不可分割的操作序列&#xff0c;这些操作要么全部执行&#xff0c;要么全部不执行。事务具有四个关键属性&#xff0c;通常称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是一个不可分割的工作单位&#xff0c;事务…

<form> + <iframe> 方式下载大文件的机制

使用 <form> <iframe> 方式下载大文件的机制之所以稳定&#xff0c;核心在于其‌分块传输‌和‌浏览器沙箱隔离‌设计。以下是技术原理详解&#xff1a; 一、底层工作机制 ‌分块传输协议‌ 表单提交后&#xff0c;服务器按 Transfer-Encoding: chunked 分块返回数…

Python--OCR(2)

一、明确 OCR 任务边界首先定义 OCR 系统的核心目标&#xff1a;场景&#xff1a;印刷体&#xff08;如文档、发票&#xff09;/ 手写体&#xff08;如笔记&#xff09;/ 特定场景&#xff08;如车牌、身份证&#xff09;输入&#xff1a;图像格式&#xff08;JPG/PNG&#xff…

基于Django的计算机资源爬虫及可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、项目目标三、系统架构与技术选型四、系统功能模块五、应用场景与价值六、项目特色与创新点七、总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试…

SH3001六轴传感器应用(二)(IIC驱动开发)

一、前言我这边使用的开发板原本已经做好了该sensor的驱动&#xff0c;但是使用过程中发现&#xff0c;原始驱动sensor是通过事件的方式上报的&#xff0c;加速度和陀螺仪数据并不同步&#xff0c;不满足使用要求&#xff0c;只有重新写一个iic的驱动&#xff0c;进行sensor数据…

面试题:基础的sql命令

基础的 SQL 命令主要用于对数据库进行查询、新增、修改、删除等操作&#xff0c;可分为以下几类&#xff1a;一、数据查询&#xff08;SELECT&#xff09;用于从表中获取数据&#xff0c;是最常用的命令。 基本语法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 条件;示…

Leetcode-3488距离最小相等元素查询

依旧二分&#xff0c;链接如下3488. 距离最小相等元素查询 看题目是个循环数组&#xff0c;记得当时做过一道什么题也是循环数组&#xff0c;就想着直接数组复制一下&#xff0c;然后跟上一道题一样&#xff0c;用hashmap来存储value的值以及value对应下标的vector。 和灵神的…

C++中的关联容器

文章目录使用关联容器定义关联容器关键字类型的要求pair类型用作返回类型关联容器上的操作关联容器的迭代器关联容器和算法添加元素删除元素map的下标操作访问元素无序容器对关键字的要求关联容器支持高效的关键字查找和访问。两个主要的关联容器的类型是map和set。其中map中的…

【Git】git提交代码报错Git: husky > pre-commit

git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代码不符合相应规则&#xff0c;则报错&#xff0c;而它的检测规则就是根据.git/hooks/pre-commi…

Unity开发者快速认识Unreal 的C++(六)GameMode之PlayerController

继承关系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一个Actor,继承了Actor的一些通用的属性和工具函数下图是PlayerController初始化组件的一个子阶段从图中可以得到的信息是&#xf…

Vue 3 服务端渲染(SSR)与客户端渲染(CSR)的区别及解决方案

1. SSR与CSR的区别1.1. SSR的原理服务端渲染&#xff08;SSR&#xff09;是在服务器端将 Vue 组件渲染为 HTML 字符串&#xff0c;并将其发送给客户端。这种方式与客户端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在浏览器中执行 JavaScript 来生成 HTML。在 SSR …

Matlab快速回顾

一1.数值 显示 格式format style 设置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作区cls3.搜索路径设置path(path,E:\ads\)oraddpath4.M文件用户把要实现的命令写在一个以.m为扩展的文件中&#xff0c;然后由matlab系统进行解读&#xff0c;最后运行结果…

开源低代码+AI引擎:百特搭企业级开发平台的演进

在数字化转型进入深水区的今天&#xff0c;企业应用开发面临前所未有的复杂挑战&#xff1a;既要快速响应业务需求&#xff0c;又要确保系统灵活可控&#xff1b;既要降低技术门槛&#xff0c;又要保障核心安全。传统开发模式与单一形态的低代码工具已难以满足多层次需求。融合…

学习 Android(十五)NDK进阶及性能优化

学习 Android&#xff08;十五&#xff09;NDK进阶及性能优化 对 NDK 相关知识有了初步的了解之后&#xff0c;我们可以更加深入的去学习 NDK 相关知识&#xff0c;接下来&#xff0c;我们将按照以下步骤进行深入学习&#xff1a; 深入理解JNI调用过程和性能消耗常见 JNI 坑&am…

QT5.12.8 QTabWidget 透明样式QSS

/* 设置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除边框可能有助于透明效果 */ }/* 标签页内的容器部件 :必须加&#xff0c;标签也才会透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…