JSON篇:解析json报文

  • Post author:
  • Post category:其他



JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。



解析JSON字符串

1.

cJSON_Parse函数

:负责解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc函数在内存中开辟一个空间,使用完成需要手动释放。

我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

2.

cJSON_GetObjectItem函数

:可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。

3.如果需要使用cJSON结构体中的内容,可通过cJSON结构体中的valueint和valuestring取出有价值的内容(即键的值)

4.可通过cJSON_Delete释放内存空间。



例程

本例程为初级篇,输出到屏幕的同时,从json字符串中获取相对应的键值,生成对应的test.json文件中。

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"


char *target="{\"name\":\"xiaoming\",\"nameid\":\"1\",\"age\":20}";


int json_analyse(char *tar)
{
     if(tar == NULL)
	 {
		printf("json_analyse tar error!\n");
	 	return -1;
	 }
	
	 cJSON *json,*json_name,*json_nameid,*json_age;
	 char *buf = NULL; 
	 //从缓冲区中解析出JSON结构
	 json = cJSON_Parse(tar);
	 if(!json)
	 {
		 printf("get json error!\n");
		 return -1;
	 }
	 
	 //将json结构格式化到缓冲区
	 buf = cJSON_Print(json);
	 
	 //cJOSN_GetObjectItem 根据key来查找json节点 若果有返回非
	 json_name = cJSON_GetObjectItem(json,"name");
	 if(!json_name)
	 {
		 printf("get json_name error!\n");
		 return -1;
	 }
	 json_nameid = cJSON_GetObjectItem(json,"nameid");
	 if(!json_nameid)
	 {
		 printf("get json_nameid error!\n");
		 return -1;
	 }
	 json_age = cJSON_GetObjectItem(json,"age");
	 if(!json_age)
	 {
		 printf("get json_age error!\n");
		 return -1;
	 }


	 printf("name type:%d,name:%s\n",json_name->type,json_name->valuestring);
	 printf("nameid type:%d,nameid:%s\n",json_nameid->type,json_nameid->valuestring);
	 printf("age type:%d,age:%d\n",json_age->type,json_age->valueint);
	 printf("name:%s,nameid:%s,num:%d\n",json_name->valuestring,json_nameid->valuestring,json_age->valueint);
    
	 //打开一个test.json文件,并写入json内容
	 FILE *fp = fopen("test.json","w");
	 fwrite(buf,strlen(buf),1,fp);

	 free(buf);
	 fclose(fp);
	 // 释放内存
     cJSON_Delete(json);
	 
	 return 1;
}

int main(int argc, char **argv)
{
	int val = 0;

	val = json_analyse(target);
	if(1 != val)
	{
		printf("json_analyse error!\n");
		return -1;
	}

	return 0;
}



运行该例程的结果

在这里插入图片描述



版权声明:本文为m0_38022615原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。