加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cJSON学习练练手--解析与组装JSON数据

发布时间:2020-12-16 19:47:11 所属栏目:百科 来源:网络整理
导读:最近换了工作,进了研华,从事物联网相关的工作。 学习了几篇JSON的文章,顺便下载了一个cJSON的源码研究了下,轻松掌握了JSON相关的东西,挺简单的,后面物联网相关的知识会接触到,先预热一波,提高工作效率。下面写了测试一个例子,例子的功能主要如下:

最近换了工作,进了研华,从事物联网相关的工作。

学习了几篇JSON的文章,顺便下载了一个cJSON的源码研究了下,轻松掌握了JSON相关的东西,挺简单的,后面物联网相关的知识会接触到,先预热一波,提高工作效率。下面写了测试一个例子,例子的功能主要如下:

自己手写一个json文件:node.json,先使用cJSON解析node.json然后打印,接下来自己组装一个自定义的json结构,然后打印并写入json_test.json。

node.json

{
	"People":[
		{"name":"yangyuanxin","telphone":"12345","age":88,"email":"mssuan@vip.qq.com","value":true},{"name":"study","telphone":"66666","email":"mmmm@vip.qq.com"}
	]

}
C代码:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "cJSON.h"
#define NR(x) (sizeof(x)/sizeof(x[0]))
#define json_file_name "C:UsersAdministratorDesktop解析json数据学习json_test_studynode.json"

int file_size(char* filename)  
{  
    FILE *fp=fopen(filename,"r");  
    if(!fp) return -1;  
    fseek(fp,0L,SEEK_END);  
    int size=ftell(fp);  
    fclose(fp);        
    return size;  
}  

//json的自定义格式 
struct People_record 
{
	const char *name ;
	const char *telphone ;
	int age ;
	const char *email ; 
	int value ;
};

struct People_record record[2]={
		{"yangyuanxin","12345",88,"mssuan@vip.qq.com",cJSON_True},{"study","66666","mmmm@vip.qq.com",cJSON_False},};


int main(void)
{
	int i ;
	int fd = -1 ;
	int fd1 = -1 ;
	int ret = -1 ;
	int json_file_len = 0 ;
	char *json_test_buffer = NULL ;
	char *out ; 
	cJSON *json ;
	cJSON *root,*fmt,*fld;
	fd = open(json_file_name,O_RDWR);
	if(-1 == fd){
		printf("open json_file fair!n");
		return -1 ;
	}
	//获取文件的长度 
	json_file_len = file_size(json_file_name);
	if(0 == json_file_len){
		printf("json_file_len is NULL!n");
		return -2 ;
	}
	//给缓存分配空间用于存储文件中的json数据 
	json_test_buffer = malloc(json_file_len);
	if(NULL == json_test_buffer){
		printf("malloc json_test_buffer fair!n");
		return -3 ;
	}
	ret = read(fd,json_test_buffer,json_file_len);
	if(-1 == ret){
		printf("read data error!n");
		return -4 ;
	}
	close(fd); //关闭文件句柄 
	printf("打印文件中的json数据n");
	//解析数据 
	json=cJSON_Parse(json_test_buffer);
	if (!json) 
	{
		printf("Error before: [%s]n",cJSON_GetErrorPtr());
		return -1 ;
	}
	else
	{
		//打印数据 
		out = cJSON_Print(json);
		cJSON_Delete(json);
		printf("%sn",out);
		free(out);
		out = NULL ;
	}
	printf("组装一个json数据n");
	
	//组装数据 
	root=cJSON_CreateObject();	//创建根 object
	cJSON_AddItemToObject(root,"People",fld=cJSON_CreateArray()); //往根object中添加一个json数组
	//组装json 
	for(i = 0 ; i < NR(record) ; i++){
		//往array中添加object 
		cJSON_AddItemToArray(fld,fmt=cJSON_CreateObject());  
		cJSON_AddStringToObject(fmt,"name",record[i].name);
		cJSON_AddStringToObject(fmt,"telephone",record[i].telphone);
		cJSON_AddNumberToObject(fmt,"age",record[i].age);
		cJSON_AddStringToObject(fmt,"email",record[i].email);
		cJSON_AddBoolToObject(fmt,"value",record[i].value);
	}
	out=cJSON_Print(root);	
	fd1 = open("json_test.json",O_RDWR|O_TRUNC);
	if(fd1 < 0){
		fd1 = open("json_test.json",O_CREAT|O_RDWR|O_TRUNC);
		if(fd1 < 0){
			printf("create file fair!n")	;
			close(fd1);
			return -1 ;
		}
	}
	printf("open file success!n");
	ret = write(fd1,out,strlen(out));
	if(-1 == ret){
		printf("write file fair!n");
		return -2 ;
	}
	close(fd1);
	cJSON_Delete(root);	
	printf("%sn",out);	
	free(out);
	free(json_test_buffer);
	out = NULL ;
	json_test_buffer = NULL ;
	return 0 ;
}

运行结果:


json_test.json

{
	"People":	[{
			"name":	"yangyuanxin","telephone":	"12345","age":	88,"email":	"mssuan@vip.qq.com","value":	true
		},{
			"name":	"study","telephone":	"66666","age":	0,"email":	"mmmm@vip.qq.com","value":	false
		}]
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读