最近在做一个外设管理平台,用PYTHON写了一个连接管理,兼容串口和套接字的连接,然后抽象为设备统一管理。使用套接字时JSON是一种很好的数据封装类型,假设我需要远程操控一个设备,发送一个JSON的数据包就可以了,像这样:
{"command":"命令","args":[各种控制参数]}
当远端设备的接收程序是使用JAVA、PYTHON这种类型程序编写的时候,解析JSON格式一般不会有大的问题,但当远程设备是能使用C语言来编写时,如一些单片机,IOT等嵌入式设备时,难道手写解析工具?
幸好有神仙为我们做了这件事情,他的主页在这里:
主角:
https://github.com/DaveGamble/cJSON
cJSON使用MIT许可证,使用起来还是很自由的,他为了兼容一些C语言编译器,编写时使用的是C89标准,这意味着类似C51之类的东西也可以编译其源代码。
一般情况下将其项目目录下的cJSON.c和cJSON.h复制到自己的项目目录下,使用即可。
注:需要动态开辟空间,事先需要支持或者实现malloc和free函数。
cJSON使用链式存储的结构,按照自己的数据格式逐层解析即可。
例如我要解析一个数据包来操控机械臂:
{"command":"M","args":[750,750,750,750]}
//先将json字符解析成cJSON结构体:
cJSON *myJson = cJSON_Parse((const char *)USART_RX_BUF);
//提取出"command"这个字段:
char *command = cJSON_GetObjectItem(myJson,"command")->valuestring;
//获取"args"字段的数组
cJSON *args = cJSON_GetObjectItem(myJson,"args");
//逐个获取其中的数值
args_number = cJSON_GetArraySize(args);
for(count = 0; count < args_number;count++)
{
CurrentArgs[count] = cJSON_GetArrayItem(args,count)->valueint;
}
简单好用