代码之字符串转cJSON

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈海平20220310

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值