如何用cJSON在服务端和客户端高效传输数据?
- 内容介绍
- 文章标签
- 相关推荐
数据往往是从服务器跑到客户端,再跑回来的循环,像是无休止的“来来回回”舞蹈。若你想让这支舞蹈走得更快、 更顺滑,就得给它一套高效又省事的舞步——那就是用cJSON把数据打包成轻量级的JSON,再用TCP/UDP或HTTP传递,将心比心...。
先说说为什么还要选cJSON?
别说我没跟你说过 cJSON 是C语言圈子里最常见、最容易上手的JSON解析库。它不像一些重量级的C++库那样需要复杂的构造函数和模板,直接一点就能搞定。对于嵌入式设备、 老旧服务器或者纯C项目,这个小家伙能帮你把繁琐的数据结构变成一串字符串,然后再变回来,客观地说...。

可别以为只要有了cJSON,所有问题都能解决。它本身不做压缩、 加密或流式处理,但它提供了快速创建、添加、解析和删除对象的方法。正主要原因是这些方法简单直观,我们可以在毫秒级别内完成一个完整的数据交换过程,一阵见血。。
一句话概括:cJSON + TCP = 数据传输不踩坑
我曾经在一次项目中,服务器每秒需要发送给客户端十几条状态更新。当时我使用XML,一路上满是乱码和缓冲区溢出的报错。后来改用cJSON+TCP后错误率降到了零,速度提升了至少五倍。那种感觉,比喝咖啡还提神,有啥用呢?。
先写代码, 再讲逻辑
#include
#include
#include
#include "cjson.h"
int main {
// 创建一个数组
cJSON *alpha娱乐 = cJSON_CreateArray;
cJSON_AddItemToArray);
cJSON_AddItemToArray);
cJSON_AddItemToArray);
// 打印数组
const char *strAlpha娱乐 = cJSON_Print;
printf;
// 删除对象释放内存
freestrAlpha娱乐);
cJSON_Delete;
return 0;
}
上面这段代码很短,但其实演示了创建数组、添加字符串元素、打印成字符串以及释放内存的完整流程。当然 你也可以用类似下面这种方式,把结构体映射成更复杂的数据:
// 构造一个用户信息对象
cJSON *user = cJSON_CreateObject;
cJSON_AddStringToObject;
cJSON_AddNumberToObject;
// 嵌套地址对象
cJSON *addr = cJSON_CreateObject;
cJOSN_AddStringToObject;
cJOSN_AddNumberToObject;
// 把地址嵌进用户
cJSon_AddItemToObject;
// 打印
printf);
// 清理
freestr);
cJSon_Delete; // 会连同addr一起删掉,主要原因是它是子节点
怎么让服务器端和客户端都用这个玩意儿?
服务器端:
- 接收请求时 用
CJson_Parse把收到的字节流转换为 - 检查命令字段
"cmd" - 根据不同命令生成对应响应
- 通过
CJson_Print/CJson_PrintUnformatted得到字符串,再用socket发送出去 - 不要忘了删除根节点!否则内存泄漏!
客户端:
- 发起请求前先构造
- 序列化后发送到服务器;收到响应后再反序列化;处理完毕后删除根节点。
- 如果你想进一步提高效率, 可以把响应做压缩,然后解压再反序列化。
| # | Name | CJson Size | No CJson Size | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A1 | UserInfo JSON Packaged by CJson | 1234 | 1456 | ||||||||||||||||||||||||||||||||||||
| A2 | UserInfo Raw Binary Packaged by custom struct | 1234 | 1100 | ||||||||||||||||||||||||||||||||||||
| A3 | UserInfo JSON Packaged by RapidJson | 1308 | 1456 | ||||||||||||||||||||||||||||||||||||
| 注:仅为示例数值,不代表真实情况。 | |||||||||||||||||||||||||||||||||||||||
😅😅😅🤯🤯🤯😜😜😜👀👀👀💨💨💨🏃♂️🏃♂️🏃♂️💻💻💻🚀🚀🚀🔧🔧🔧🌐🌐🌐🕸️🕸️🕸️🍵🍵🍵🥤🥤🥤☕☕☕😂😂😂✌️✌️✌️🎉🎉🎉🎊🎊🎊🛠️🛠️🛠️⚙️⚙️⚙️📈📈📈📉📉📉📺📺📺🖥️🖥️🖥️🗂️🗂️🗂️📚📚📚⏰⏰⏰⌚⌚⌚🔍🔍🔍✨✨✨🔥🔥🔥🌟🌟🌟🙌🙌🙌💪💪💪⚡⚡⚡✔✔✔✘✘✘❓❓❓✅✅✅❎❎❎➡➡➡⬆⬆⬆⬇⬇⬇←←←→→→→ 🎭🎭🎭👻👻👻🍬🍬🍬🐱🐱🐱🐶🐶🐶 🦄🦄🦄🚁🚁🚁 🚲🚲🚲 🚑🚑🚑 📞☎☎ 📳🔔🔔 🎹🥁🎷 🎮👾🤖 💡🔋⚡⚙ 💼👜👛 👟🏃♀🏋♂ 🏊♀ 🤿 ⛷♂ 🏹 ⚔ 🏹 🎯 😬 😬 😬 😴 😴 😴 🌞 🌞 🌞 🌝 🌝 🌝 🌜 🌜 🌜 🔥 🔥 🔥 💧 💧 💧 ❄ ❄ ❄ 🎲 🎲 🎲 🪙 🪙 🪙 ✂ ✂ ✂ 📸 📸 📸 📝 📒 📓 🔫 🔫 🔫 ⚽ ⚾ ⚾ 🏀 🏐 🍔 🍟 🍿 🤝 🤝 🤝 ☺ ☺ ☺ 🙃 🙃 🙃 👉 👉 👉 👈 👈 👈 👊 👋 援助 ❤️ ❤️ ❤️ ➕ ➗ ✖︎ ÷︎ ⩿ ⩽ ⩾ ♠ ♥ ♦ ♣ ♨︎ ♨︎ ♨︎ ⭕ ◼︎ ◼︎◼︎ ✅ ❌ ☑ ✔ ✔ ✔ ✨✨✨✨✨✨)
)
* 在服务端, 你可以把每一次业务调用包装成
| |||||||||||||||||||||||||||||||||||||||
数据往往是从服务器跑到客户端,再跑回来的循环,像是无休止的“来来回回”舞蹈。若你想让这支舞蹈走得更快、 更顺滑,就得给它一套高效又省事的舞步——那就是用cJSON把数据打包成轻量级的JSON,再用TCP/UDP或HTTP传递,将心比心...。
先说说为什么还要选cJSON?
别说我没跟你说过 cJSON 是C语言圈子里最常见、最容易上手的JSON解析库。它不像一些重量级的C++库那样需要复杂的构造函数和模板,直接一点就能搞定。对于嵌入式设备、 老旧服务器或者纯C项目,这个小家伙能帮你把繁琐的数据结构变成一串字符串,然后再变回来,客观地说...。

可别以为只要有了cJSON,所有问题都能解决。它本身不做压缩、 加密或流式处理,但它提供了快速创建、添加、解析和删除对象的方法。正主要原因是这些方法简单直观,我们可以在毫秒级别内完成一个完整的数据交换过程,一阵见血。。
一句话概括:cJSON + TCP = 数据传输不踩坑
我曾经在一次项目中,服务器每秒需要发送给客户端十几条状态更新。当时我使用XML,一路上满是乱码和缓冲区溢出的报错。后来改用cJSON+TCP后错误率降到了零,速度提升了至少五倍。那种感觉,比喝咖啡还提神,有啥用呢?。
先写代码, 再讲逻辑
#include
#include
#include
#include "cjson.h"
int main {
// 创建一个数组
cJSON *alpha娱乐 = cJSON_CreateArray;
cJSON_AddItemToArray);
cJSON_AddItemToArray);
cJSON_AddItemToArray);
// 打印数组
const char *strAlpha娱乐 = cJSON_Print;
printf;
// 删除对象释放内存
freestrAlpha娱乐);
cJSON_Delete;
return 0;
}
上面这段代码很短,但其实演示了创建数组、添加字符串元素、打印成字符串以及释放内存的完整流程。当然 你也可以用类似下面这种方式,把结构体映射成更复杂的数据:
// 构造一个用户信息对象
cJSON *user = cJSON_CreateObject;
cJSON_AddStringToObject;
cJSON_AddNumberToObject;
// 嵌套地址对象
cJSON *addr = cJSON_CreateObject;
cJOSN_AddStringToObject;
cJOSN_AddNumberToObject;
// 把地址嵌进用户
cJSon_AddItemToObject;
// 打印
printf);
// 清理
freestr);
cJSon_Delete; // 会连同addr一起删掉,主要原因是它是子节点
怎么让服务器端和客户端都用这个玩意儿?
服务器端:
- 接收请求时 用
CJson_Parse把收到的字节流转换为 - 检查命令字段
"cmd" - 根据不同命令生成对应响应
- 通过
CJson_Print/CJson_PrintUnformatted得到字符串,再用socket发送出去 - 不要忘了删除根节点!否则内存泄漏!
客户端:
- 发起请求前先构造
- 序列化后发送到服务器;收到响应后再反序列化;处理完毕后删除根节点。
- 如果你想进一步提高效率, 可以把响应做压缩,然后解压再反序列化。
| # | Name | CJson Size | No CJson Size | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A1 | UserInfo JSON Packaged by CJson | 1234 | 1456 | ||||||||||||||||||||||||||||||||||||
| A2 | UserInfo Raw Binary Packaged by custom struct | 1234 | 1100 | ||||||||||||||||||||||||||||||||||||
| A3 | UserInfo JSON Packaged by RapidJson | 1308 | 1456 | ||||||||||||||||||||||||||||||||||||
| 注:仅为示例数值,不代表真实情况。 | |||||||||||||||||||||||||||||||||||||||
😅😅😅🤯🤯🤯😜😜😜👀👀👀💨💨💨🏃♂️🏃♂️🏃♂️💻💻💻🚀🚀🚀🔧🔧🔧🌐🌐🌐🕸️🕸️🕸️🍵🍵🍵🥤🥤🥤☕☕☕😂😂😂✌️✌️✌️🎉🎉🎉🎊🎊🎊🛠️🛠️🛠️⚙️⚙️⚙️📈📈📈📉📉📉📺📺📺🖥️🖥️🖥️🗂️🗂️🗂️📚📚📚⏰⏰⏰⌚⌚⌚🔍🔍🔍✨✨✨🔥🔥🔥🌟🌟🌟🙌🙌🙌💪💪💪⚡⚡⚡✔✔✔✘✘✘❓❓❓✅✅✅❎❎❎➡➡➡⬆⬆⬆⬇⬇⬇←←←→→→→ 🎭🎭🎭👻👻👻🍬🍬🍬🐱🐱🐱🐶🐶🐶 🦄🦄🦄🚁🚁🚁 🚲🚲🚲 🚑🚑🚑 📞☎☎ 📳🔔🔔 🎹🥁🎷 🎮👾🤖 💡🔋⚡⚙ 💼👜👛 👟🏃♀🏋♂ 🏊♀ 🤿 ⛷♂ 🏹 ⚔ 🏹 🎯 😬 😬 😬 😴 😴 😴 🌞 🌞 🌞 🌝 🌝 🌝 🌜 🌜 🌜 🔥 🔥 🔥 💧 💧 💧 ❄ ❄ ❄ 🎲 🎲 🎲 🪙 🪙 🪙 ✂ ✂ ✂ 📸 📸 📸 📝 📒 📓 🔫 🔫 🔫 ⚽ ⚾ ⚾ 🏀 🏐 🍔 🍟 🍿 🤝 🤝 🤝 ☺ ☺ ☺ 🙃 🙃 🙃 👉 👉 👉 👈 👈 👈 👊 👋 援助 ❤️ ❤️ ❤️ ➕ ➗ ✖︎ ÷︎ ⩿ ⩽ ⩾ ♠ ♥ ♦ ♣ ♨︎ ♨︎ ♨︎ ⭕ ◼︎ ◼︎◼︎ ✅ ❌ ☑ ✔ ✔ ✔ ✨✨✨✨✨✨)
)
* 在服务端, 你可以把每一次业务调用包装成
| |||||||||||||||||||||||||||||||||||||||

