1.1 背景
项目中,用mqtt协议进行传输数据,需要对数据进行cjson格式化之后,再发送,总结了以下一些常用的例子,cjson库可以从网上下载。
1.2 demo
/*************************************************************************
> File Name: example.c
> Author: ma6174
> Mail: ma6174@163.com
> Created Time: Fri 26 Jul 2019 02:01:45 PM CST
************************************************************************/
#include <stdio.h>
#include <cJSON.h>
#include <stdlib.h>
#define DEBUG_INFO(fmt, args...) printf("\033[33m[%s:%s:%d]\033[0m "#fmt"\r\n", __FILE__,__FUNCTION__, __LINE__, ##args)
//创建数组
void create_json_array(void)
{
//创建一个对象root
cJSON *root = cJSON_CreateObject();
//root对象添加成员Data_ID,类型number
cJSON_AddNumberToObject(root ,"Data_ID",1000);
cJSON * Data_Item;
//root对象添加成员Data,类型是一个对象
cJSON_AddItemToObject(root ,"Data" , Data_Item = cJSON_CreateObject());
cJSON * Ip_Item;
//往Data_Item对象添加数组Ip_Item
cJSON_AddItemToObject(Data_Item ,"IpList",Ip_Item = cJSON_CreateArray());
//往数组Ip_Item,依次添加成员
cJSON *dira;
cJSON_AddItemToObject(Ip_Item , "dira", dira = cJSON_CreateObject());
cJSON_AddStringToObject(dira ,"Key", "123457");
cJSON_AddStringToObject(dira ,"Ipaddr","192.168.1.1");
cJSON_AddItemToObject(Ip_Item , "dira", dira = cJSON_CreateObject());
cJSON_AddStringToObject(dira ,"Key", "123456");
cJSON_AddStringToObject(dira ,"Ipaddr","192.168.1.2");
cJSON_AddItemToObject(Ip_Item , "dira", dira = cJSON_CreateObject());
cJSON_AddStringToObject(dira ,"Key", "123456");
cJSON_AddStringToObject(dira ,"Ipaddr","192.168.1.3");
cJSON_AddItemToObject(Ip_Item , "dira", dira = cJSON_CreateObject());
cJSON_AddStringToObject(dira ,"Key", "123458");
cJSON_AddStringToObject(dira ,"Ipaddr","192.168.1.4");
char *JsonOut=cJSON_Print(root);
DEBUG_INFO("%s",JsonOut);
//释放内存
cJSON_Delete(root);
free(JsonOut);
}
//字符串格式化成json格式
void string_to_cjson(void)
{
char *str = "{\"Data_Id\":100,\"Ip_List\":[{\"Ip\":\"172.168.1.1\",\"host\":\"c1\"},{\"Ip\":\"172.168.1.2\",\"host\":\"c3\"},{\"Ip\":\"172.168.1.3\",\"host\":\"c3\"}]}";
cJSON *root = cJSON_Parse(str);
if(!root)
{
return;
}
//根据key,"Ip_List",获取root对象中的Ip_List对象
cJSON *Ip_List = cJSON_GetObjectItem(root,"Ip_List");
if (Ip_List)
{
//获取数组大小
int Num=cJSON_GetArraySize(Ip_List);
int i = 0;
for(i; i < Num; i++)
{
//根据索引依次获取数组成员
cJSON* Item = cJSON_GetArrayItem(Ip_List, i);
//取出数组元素
cJSON *Ip= cJSON_GetObjectItem(Item,"Ip");
if(Ip && Ip->type==cJSON_String)
{
DEBUG_INFO("%s",Ip->valuestring);
}
cJSON *host= cJSON_GetObjectItem(Item,"host");
if(host && host->type==cJSON_String)
{
DEBUG_INFO("%s",host->valuestring);
}
}
}
free(root);
}
int main(void)
{
create_json_array();
string_to_cjson();
return 0;
}
测试效果: