文章目录
- 前言
- json协议的基本格式
- json 数组类型 的语法规则
- json协议报文的实例
- json常见的一些格式错误
- 在gd32中使用cjson库
- 小结
前言
json协议在互联网应用,物联网应用中都会用到。所谓工欲善其事必先利其器,我们需要学习了解json协议的具体格式,以及在某些场景中如何编写json报文。
最后,我们再学习了解在嵌入式C语言的环境中时常使用的json库-cjson
json协议的基本格式
json协议是使用了 Key-value这种键值对的 形式实现的协议。协议基本结构如下所示。
{
"key1": value1,
"key2": value2,
"nestedObject": {
"key3": value3
},
"array": [value4, value5]
}
注意点:
- 键名(Key):必须用双引号包裹的字符串。
- 值(Value):支持类型包括:
- 字符串(
"value"
) - 数字(
123
、3.14
) - 布尔值(
true
/false
) - 对象(
{ ... }
) - 数组(
[ ... ]
) null
- 字符串(
- value可以也是一个 json对象,如上述的
{ "key3": value3 }
- value可以是一个数组,如上述的
[value4, value5]
- 除了最后一个Key-value键值对,其他的键值对都需要在末尾加上一个逗号:
,
json协议的一个示例
{
"key1": "value1",
"key2": "value2"
}
通过一些在线校验工具,我们可以校验自己编写的json协议报文是否正确。
笔者使用的在线建议工具:bejson.com
json 数组类型 的语法规则
- 语法要求
最后一个元素后不能有逗号。
元素之间必须严格用逗号分隔 - 元素类型:
支持任意 JSON 数据类型,包括:- 字符串(
"value"
) - 数字(
123
、3.14
) - 布尔值(
true
/false
) - 对象(
{ ... }
) - 数组(
[ ... ]
) null
- 字符串(
使用数组的示例
- 使用 简单数据类型 的数组
{
"tags": ["news", "technology", "2023"],
"scores": [95, 88.5, 72],
"flags": [true, false, true]
}
- 使用 json对象类型 的数组
{
"users": [
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
}
- 使用 数组类型 的数组 (嵌套数组)
{
"matrix": [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
}
- 使用 混合数据类型 的数组(合法但不推荐)
{
"mixed_data": [
"text",
42,
{ "key": "value" },
[1, 2],
null
]
}
json协议报文的实例
用于用户注册的HTTP请求体
// HTTP请求体(用户注册)
{
"username": "john_doe",
"email": "john@example.com",
"age": 28,
"is_active": true,
"hobbies": ["reading", "coding"]
}
// HTTP响应(成功)
{
"status": 200,
"data": {
"user_id": "12345",
"created_at": "2023-10-05T14:48:00Z"
}
}
// 错误响应
{
"status": 400,
"error": {
"code": "INVALID_EMAIL",
"message": "Email format is invalid"
}
}
json常见的一些格式错误
- 错误1:末尾多余的逗号
// ❌ 错误
"numbers": [1, 2, 3, ]
// ✅ 正确
"numbers": [1, 2, 3]
- 错误2:缺少引号(字符串元素)
// ❌ 错误
"colors": [red, green, blue]
// ✅ 正确
"colors": ["red", "green", "blue"]
- 错误3:键名未用双引号
// ❌ 错误(键名必须用双引号)
{ key: [1, 2, 3] }
// ✅ 正确
{ "key": [1, 2, 3] }
在gd32中使用cjson库
待续
小结
json的具备的优势如下
- 易读性:结构清晰,易于人类阅读和调试。
- 高效性:体积小,解析速度快(对比XML)。
- 跨平台:所有主流编程语言均提供原生或第三方解析库(如Python的json模块、Java的Jackson,C语言的cjson)。