JSON 简介(JavaScript Object Notation)
JSON(JavaScript Object Notation)是一种轻量级的 数据交换格式,广泛用于网络传输、配置文件和数据存储。它的设计易于人阅读和编写,同时也易于机器解析和生成。
1. JSON 的基本结构
JSON 由 键值对(Key-Value Pairs) 组成,支持以下数据类型:
- 对象(Object) →
{ "key": value }
- 数组(Array) →
[ value1, value2, ... ]
- 字符串(String) →
"text"
- 数字(Number) →
123
,3.14
- 布尔值(Boolean) →
true
,false
- 空值(Null) →
null
示例 JSON
{
"name": "John",
"age": 30,
"isStudent": false,
"courses": ["Math", "Physics"],
"address": {
"city": "New York",
"zip": "10001"
}
}
JSON 的大括号 {}
和 中括号 []
详解
在 JSON 中,大括号 {}
和 中括号 []
是两种核心符号,分别表示 对象(Object) 和 数组(Array)。它们的用途和语法规则如下:
1. 大括号 {}
:表示对象(Object)
作用
- 用于存储 键值对(Key-Value Pairs),类似编程中的字典或结构体。
- 键(Key)必须是 字符串(用双引号包裹),值(Value)可以是任意 JSON 数据类型。
语法规则
{
"key1": value1,
"key2": value2
}
- 键名必须用双引号
""
,单引号或裸字符串无效。 - 值可以是:字符串、数字、布尔值、对象、数组、
null
。 - 最后一个键值对后不能有逗号(否则解析会失败)。
示例
{
"name": "John",
"age": 30,
"isStudent": false,
"address": {
"city": "New York"
}
}
2. 中括号 []
:表示数组(Array)
作用
- 用于存储 有序的值列表,类似编程中的数组或列表。
- 数组中的元素可以是任意 JSON 数据类型(包括对象或其他数组)。
语法规则
[ value1, value2, value3 ]
- 元素之间用逗号分隔。
- 最后一个元素后不能有逗号(严格模式会报错)。
- 元素类型可以混合(但通常保持类型一致)。
示例
["apple", "banana", "orange"] // 字符串数组
[1, 2, 3.5] // 数字数组
[
{ "name": "John" },
{ "name": "Alice" }
] // 对象数组
3. 嵌套组合使用
JSON 支持 对象和数组的任意嵌套,这是其灵活性的关键。
示例:嵌套对象和数组
{
"users": [
{
"name": "John",
"skills": ["C++", "Python"]
},
{
"name": "Alice",
"skills": ["JavaScript", "Java"]
}
],
"total": 2
}
users
是一个 数组,包含两个 对象。- 每个对象中的
skills
又是一个 数组。
4. 常见问题解答
Q1:键名可以不用引号吗?
- 不可以! JSON 标准要求键名必须用 双引号
""
,否则解析会失败。{ name: "John" } // 错误! { "name": "John" } // 正确
Q2:数组和对象能混用吗?
- 可以,但需确保语法正确。
{ "data": [ { "id": 1 }, [1, 2, 3] // 对象和数组混用 ] }
Q3:最后一个元素后能加逗号吗?
- 不能! 这是 JSON 的严格语法规则。
["a", "b",] // 错误! ["a", "b"] // 正确
Q4:JSON 能写注释吗?
- 原生不支持注释,但某些解析器允许以下变通方式:
{ "__comment": "这是伪注释", "name": "John" }
5. 在 Unreal Engine 中的解析
若需在 UE 中解析嵌套 JSON,可使用 FJsonObject
和 FJsonValue
:
TSharedPtr<FJsonObject> JsonObject;
// 解析 JSON 字符串
if (FJsonSerializer::Deserialize(Reader, JsonObject)) {
// 获取对象字段
FString Name;
JsonObject->GetStringField("name");
// 获取数组字段
const TArray<TSharedPtr<FJsonValue>>* UsersArray;
JsonObject->TryGetArrayField("users", UsersArray);
}
总结
符号 | 类型 | 用途 | 示例 |
---|---|---|---|
{} | 对象 | 存储键值对 | { "key": "value" } |
[] | 数组 | 存储有序列表 | [ "a", "b", 123 ] |
嵌套 | 任意组合 | 构建复杂数据结构 | { "data": [ {...} ] } |
理解 {}
和 []
的区别是掌握 JSON 的关键!