第一部分:什么是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)
- 定义:整数或浮点数,支持正负、小数、指数形式(如
e
或E
表示科学计数法)。 - 注意:不能包含逗号(如
1,000
不合法),没有八进制、十六进制表示(只能十进制)。
{
"age": 25, // 整数
"height": 1.75, // 浮点数
"temperature": -5.2, // 负数
"distance": 3.6e5 // 科学计数法(3.6×10⁵ = 360000)
}
c. 布尔值(Boolean)
- 定义:只有两个可能的值:
true
(真)或false
(假),用于表示逻辑状态。 - 注意:必须小写(
True
或FALSE
不合法)。
{
"isStudent": true,
"hasGraduated": false
}
d. 空值(Null)
- 定义:表示 “无值” 或 “缺失值”,仅用
null
表示。 - 注意:必须小写(
Null
或NULL
不合法),用于明确表示某个键不存在值(区别于空字符串""
)。
{
"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"));
// 输出:所在省份:广东