cJSON的使用
json的数据结构
//c中没有对象,所以json数据是采用链表存储的
typedef struct cJSON {
struct cJSON *next,*prev; // 数组 对象数据中用到
struct cJSON *child; // 数组 和对象中指向子数组对象或值
int type; // 元素的类型,如是对象还是数组
char *valuestring; // 如果是字符串
int valueint; // 如果是数值
double valuedouble; // 如果类型是cJSON_Number
char *string; // The item's name string, if this item is the child of, or is in the list of subitems of an object.
} cJSON;
关于cJSON的操作
①:要操作的字符串my_json_string
static const char my_json_string[] =
{
"name": "Jack (\"Bee\") Nimble",
"Ret": 100,
"format": {
"type": "rect",
"width": 1920,
"height": 1080,
"interlace": false,
"frame rate": 24
}
}
②:将字符串解析成json结构体
cJSON *root = cJSON_Parse(my_json_string);
③:获取某个元素
cJSON *format = cJSON_GetObjectItem(root,"format");
int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;
④:将json结构体转换成字符串
char *rendered=cJSON_Print(root);
⑤:删除JSON
cJSON_Delete(root);
⑥:构建一个json结构体
cJSON *root,*fmt;
root=cJSON_CreateObject();
cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));
cJSON_AddItemToObject(root, "Ret", cJSON_CreateNumber(100));
cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject()); //把fmt结构体指针增加到root链表的末端
cJSON_AddStringToObject(fmt,"type", "rect");
cJSON_AddNumberToObject(fmt,"width", 1920);
cJSON_AddNumberToObject(fmt,"height", 1080);
cJSON_AddFalseToObject (fmt,"interlace");
cJSON_AddNumberToObject(fmt,"frame rate", 24);
实际代码(构建JSON结构体。节省空间)
要转换的字符串
字符串:
static const char g_aDefaultInfo[] =
{
"{ \"NetWork.NetCommon\" : { \"GateWay\" : \"0x01200A0A\", \"HostIP\" : \"0xC3200A0A\", \"Submask\" : \"0x00FFFFFF\", \
\"Pid\" : \"101jskak2flct3ad\", \
\"HostName\" : \"viot-a501-abcd\", \
\"DeviceType\" : 00, \"HttpPort\" : 80,\"MAC\" : \"00:10:5C:F2:1C:B4\", \
\"MaxBps\" : 0, \"MonMode\" : \"TCP\", \"SN\" : \"123\", \"SSLPort\" : 8443, \
\"TCPMaxConn\" : 10, \"TCPPort\" : 34567, \"TransferPlan\" : \"AutoAdapt\", \"UDPPort\" : 34568, \"UseHSDownLoad\" : false , \
\"pAddr\" : \"2001:da8:2004:1000:202:116:160:41\", \"pGateway\" : \"2001::cb4f:1\", \
\"pLocalLinkAddr\" : \"fe80::212:12ff:fe36:1803/64\" }, \"Ret\" : 100, \"SessionID\" : \"0x00000000\" }"
};
printf打印字符串g_aDefaultInfo:
{
"NetWork.NetCommon" :
{
"GateWay" : "0x01200A0A",
"HostIP" : "0xC3200A0A",
"Submask" : "0x00FFFFFF",
"Pid" : "101jskak2flct3ad",
"HostName" : "viot-a501-abcd",
"DeviceType" : 00,
"HttpPort" : 80,
"MAC" : "00:10:5C:F2:1C:B4",
"MaxBps" : 0,
"MonMode" : "TCP",
"SN" : "123",
"SSLPort" : 8443,
"TCPMaxConn" : 10,
"TCPPort" : 34567,
"TransferPlan" : "AutoAdapt",
"UDPPort" : 34568,
"UseHSDownLoad" : false ,
"pAddr" : "2001:da8:2004:1000:202:116:160:41",
"pGateway" : "2001::cb4f:1",
"pLocalLinkAddr" : "fe80::212:12ff:fe36:1803/64"
},
"Ret" : 100,
"SessionID" : "0x00000000"
}
typedef char XM_CHAR;
typedef unsigned char XM_U8;
static XM_S32 IPSearch_getEthInfo(XM_CHAR *pEthName, XM_CHAR *pBuf)
{
NETIP_HEAD_T stSendNETIPHead;
XM_S32 sndDataLength = 0;
XM_CHAR *pSndData = pBuf; //发送数据
XM_S32 length = 1024;
XM_U32 tmp;
cJSON* IPSearchJson = NULL; //JSON主体
cJSON* NetWorkJson = NULL; //JSON主体中的NetWork
XM_CHAR aBuf[64];
XM_CHAR aMacStr[32];
XM_CHAR aIp[32] = {'\0'};
XM_CHAR aNetmask[32] = {'\0'};
XM_CHAR aGateway[32] = {'\0'};
XM_CHAR aModifyName[32] = {"viot-a501-abcd"};
XM_S32 deviceType = 0;
time_t nowtime;
struct tm *pstTimeInfo;
XM_CHAR aField[256] = {'\0'};
XM_CHAR aDateTime[32] = {'\0'};
XM_CHAR aOutput[16] = {'\0'};
if (pEthName == NULL || pBuf == NULL)
{
ERROR_PRINTF("getEthInfo: NULL param \n");
return XM_FAILURE;
}
else if(strcmp(pEthName, "eth0") && strcmp(pEthName, "eth2"))
{
ERROR_PRINTF("getEthInfo: error pEthName %s\n", pEthName);
return XM_FAILURE;
}
IPSearchJson = cJSON_CreateObject();
if(!IPSearchJson)
{
goto err;
}
NetWorkJson = cJSON_CreateObject();
if(!NetWorkJson)
{
goto err;
}
cJSON_AddItemToObject(IPSearchJson, "NetWork.NetCommon", NetWorkJson);
cJSON_AddStringToObject(NetWorkJson, "Pid", "101jskak2flct3ad");
cJSON_AddStringToObject(NetWorkJson, "HostName", "viot-a501-abcd");
cJSON_AddNumberToObject(NetWorkJson, "DeviceType", 00);
cJSON_AddNumberToObject(NetWorkJson, "HttpPort", 80);
cJSON_AddStringToObject(NetWorkJson, "MAC", "00:10:5C:F2:1C:B4");
cJSON_AddNumberToObject(NetWorkJson, "MaxBps", 0);
cJSON_AddStringToObject(NetWorkJson, "MonMode", "TCP");
cJSON_AddStringToObject(NetWorkJson, "SN", "8ecaafba792f8b449px5");
cJSON_AddNumberToObject(NetWorkJson, "SSLPort", 8443);
cJSON_AddNumberToObject(NetWorkJson, "TCPMaxConn", 10);
cJSON_AddNumberToObject(NetWorkJson, "TCPPort", 34567);
cJSON_AddStringToObject(NetWorkJson, "TransferPlan", "AutoAdapt");
cJSON_AddNumberToObject(NetWorkJson, "UDPPort", 34568);
cJSON_AddFalseToObject(NetWorkJson, "UseHSDownLoad");
//cJSON_AddTrueToObject(NetWorkJson, "UseHSDownLoad");
cJSON_AddStringToObject(NetWorkJson, "pAddr", "2001:da8:2004:1000:202:116:160:41");
cJSON_AddStringToObject(NetWorkJson, "pGateway", "2001::cb4f:1");
cJSON_AddStringToObject(NetWorkJson, "pLocalLinkAddr", "fe80::212:12ff:fe36:1803/64");
if(NULL != aMacStr && NULL != aBuf)
{
time(&nowtime);
pstTimeInfo = localtime(&nowtime);
sprintf(aDateTime, "%d-%02d-%02d %02d:%02d:%02d",
pstTimeInfo->tm_year + 1900, (pstTimeInfo->tm_mon + 1) & 0xFF,pstTimeInfo->tm_mday & 0xFF,
pstTimeInfo->tm_hour & 0xFF, pstTimeInfo->tm_min & 0xFF, pstTimeInfo->tm_sec & 0xFF);
sprintf(aField, "D=%s V=%s",aDateTime, aOutput);
printf("aField = [%d : %s]\n", strlen(aField),aField);
cJSON_AddStringToObject(NetWorkJson, "OtherFunction", aField);
}
cJSON_AddItemToObject(IPSearchJson, "Ret", cJSON_CreateNumber(100));
cJSON_AddItemToObject(IPSearchJson, "SessionID", cJSON_CreateString("0x00000000"));
//把JSON数据转换为字符串
char *aBuffer = cJSON_PrintUnformatted(IPSearchJson);
if(!aBuffer)
{
goto err;
}
/****************************************************************
aBuffer:打印效果
{
"NetWork.NetCommon" :
{
"GateWay" : "0x011FA8C0",
"HostIP" : "0xAB1FA8C0",
"Submask" : "0x00FFFFFF",
"Pid" : "101jskak2flct3ad",
"HostName" : "viot-a501-abcd",
"DeviceType" : 00,
"HttpPort" : 80,
"MAC" : "00:00:00:00:5c:36",
"MaxBps" : 0,
"MonMode" : "TCP",
"SN" : "8ecaafba792f8b449px5",
"SSLPort" : 8443,
"TCPMaxConn" : 10,
"TCPPort" : 34567,
"TransferPlan" : "AutoAdapt",
"UDPPort" : 34568,
"UseHSDownLoad" : false ,
"pAddr" : "2001:da8:2004:1000:202:116:160:41",
"pGateway" : "2001::cb4f:1",
"pLocalLinkAddr" : "fe80::212:12ff:fe36:1803/64",
"OtherFunction": "D=1970-01-01 00:16:58 V="
},
"Ret" : 100,
"SessionID" : "0x00000000"
}
****************************************************************/
printf("[%d]JSON = [%s]\n", __LINE__,cJSON_PrintUnformatted(IPSearchJson));
printf("[%d]aBuffer = [%d : %s]\n", __LINE__,strlen(aBuffer), aBuffer);
length = strlen(aBuffer);
stSendNETIPHead.DataLen = length + 1;
sndDataLength = 0;
memcpy((XM_U8*)(pSndData+sndDataLength), (XM_U8*)&stSendNETIPHead, NETIP_HEAD_SIZE);
sndDataLength += NETIP_HEAD_SIZE;
memcpy((XM_U8*)(pSndData+sndDataLength), (XM_U8*)aBuffer, (length+1));
sndDataLength += (length + 1);
printf("__[%d]__sndDataLength = [%d : %p]\n", __LINE__, sndDataLength, pSndData);
printf("__[%d]__ pSndData = [%d : %d]\n", __LINE__,sndDataLength, strlen(pSndData));
printf("pSndData = [%s]\n", pSndData+20);
if(IPSearchJson)
{
cJSON_Delete(IPSearchJson);
}
if(aBuffer)
{
free(aBuffer);
}
return sndDataLength;
err:
if(IPSearchJson)
{
cJSON_Delete(IPSearchJson);
}
return XM_FAILURE;
}
参考资料
想要进一步了解cJSON:https://blog.csdn.net/qq_40963043/category_9350327.html