JSON _大括号 {} 和 中括号 []

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,可使用 FJsonObjectFJsonValue

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 的关键!

### C语言中JSON解析与验证 #### 定义JSON对象数组结构体 为了有效地处理JSON数据,在C语言中通常会先定义表示`JSONObject``JSONArray`的结构体。这有助于后续操作这些复杂的数据类型[^1]。 ```c typedef struct { char *key; void *value; // 可能是指向其他类型的指针,比如字符串、整数或另一个json对象/数组 } JSONObject; typedef struct json_array_element { void *data; // 存储实际数据项的位置 struct json_array_element *next; // 指向下一项的指针 } JSONArrayElement; typedef struct { JSONArrayElement *head; int length; } JSONArray; ``` #### 实现基础解析逻辑 对于简单的键值对形式(`{}`),可以逐字符读取输入流并构建相应的内部表示;而对于列表型数据([]), 则需特别注意区分不同元素间的边界条件[^2]。 - **解析流程** - 初始化状态机用于跟踪当前解析位置; - 当遇到'{'时进入对象模式,'}'结束该层嵌套; - '['启动数组解析,'-'则标记数字可能为负数等特殊情况; - 处理转义序列以支持特殊字符编码; - **错误检测机制** - 记录未闭合的大括号数量来判断是否存在不完整的对象声明; - 对于预期之外的符号立即抛出异常终止解析过程; - 确认所有的keys都由双引号包围,并且values也遵循同样的规则[^3]。 #### 示例代码片段展示部分核心函数 下面给出了一段简化版的伪码用来说明上述概念: ```c int parse_json(const char* input){ enum State { OUTSIDE, IN_STRING, IN_OBJECT, IN_ARRAY } state = OUTSIDE; Stack stack; /* 假设这里有一个辅助栈 */ while (*input != '\0'){ switch(state){ case OUTSIDE: if(*input == '"') state=IN_STRING; else if(*input=='[' || *input==']'|| *input=='{'|| *input== '}') handle_bracket(input); break; case IN_STRING: if(*input == '"' && !is_escaped()) state=OUTSIDE; check_string_validity(); break; default: ; } update_state_based_on_input(&state,*input++); } validate_all_objects_closed_properly(stack); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值