cjson格式学习

简介:

JSON:JavaScript对象表示法(JavaScript Object Notation)。是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似C语音家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON解析器和JSON库支持许多不同的编程语言。JSON文本格式在语法上与创建JavaScript对象的代码相同。由于这种相似性,无需解释器,JavaScript程序能够使用内建的eval()函数,用JSON数据来生成原生的JavaScript对象。

JSON是存储和交换文本信息的语法,类似XML。但JSON比XML更小、更快、更易解析;且JSON具有自我描述性、语法简单,易于理解。


这里我们学习c语言下的cjson知识

为啥学这个呢

cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。

cjson 结构体描述
typedefstruct cJSON {

//采用链表存储,也就是说类似与双向链表,但是每个节点又可以有自己的孩子
structcJSON *next,*prev; 
struct cJSON *child;


int type;
/*
type一共有7种取值,分别是:
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6

如果是Number类型,则valueint或valuedouble中存储着各自不同类型的值,前者是int,后者是double.

如果是String类型的,则valuestring中存储着值,可以访问valuestring得到值。
*/

//这三个就是我们常访问的字段值
char * valuestring;
int valueint;
double valuedouble;

char *string;   //存放的是这个节点的名字

}cJSON;

JSON 语法规则

JSON 语法是 JavaScript 对象表示法语法的子集。

  1. 数据在名称/值对中
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

JSON 值

JSON 值可以是:

  1. 数字(整数或浮点数)
  2. 字符串(在双引号中)
  3. 逻辑值(true 或 false)
  4. 数组(在方括号中)
  5. 对象(在花括号中)
  6. null

更详细的内容请点击这里!


cjson常用函数

以下文段来自此篇博客,请点击!

  1. cJSON * cJSON_CreateObject();
    创建一个json对象,返回一个cJSON结构体类型的指针。

  2. cJSON *cJSON_CreateArray();
    创建一个数组对象,返回一个cJSON结构体类型的指针。

  3. cJSON *cJSON_CreateString(const char *string);
    创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。

  4. void cJSON_AddItemToArray(cJSON *array, cJSON *item);
    向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象; item为添加入数字对象中的对象指针。

  5. void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
    向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。

  6. cJSON *cJSON_Parse(const char *value);
    解析一个json串,传入一个json格式的字符串,返回一个cJSON *类型的结构体指针。

  7. char *cJSON_Print(cJSON *item);
    将一个cJSON结构体代表的json对象转换为一个json格式的字符串。

  8. void cJSON_Delete(cJSON *c);
    释放一个cJSON对象所占用的内存空间。

  9. cJSON *format = cJSON_GetObjectItem(cJSON item,const char s);
    将一个cjson对象里的相对应的key字段值提取出来,用法:int framerate = cJSON_GetObjectItem(format,“frame rate”)->valueint;
    (在Linux环境时候,读取json文件中不存在的字段时,cJSON_GetObjectItem卡死,产生core。
    没有这个字段,则cJSON_GetObjectItem返回NULL。空指针指向子域,报错。)

代码应用

{
	"name": "中国",
	"province": [{
		"name": "广西",
		"cities": {
			"city": ["桂林", "南宁"]
		}
	}, {
		"name": "广东",
		"cities": {
			"city": ["广州", "深圳", "珠海"]
		}
	}, {
		"name": "陕西",
		"cities": {
			"city": ["宝鸡", "西安"]
		}
	}, {
		"name": "新疆",
		"cities": {
		        "city": ["乌鲁木齐"]
		}
	}]
}

上述json的生成:

#include <stdio.h>
 
#include "cJSON.h"
#include "cJSON_Utils.h"
 
#pragma comment(lib,"cjson.lib")
 
int main(void)
{
	cJSON * json = cJSON_CreateObject();
 
	cJSON *provinceArray = cJSON_CreateArray();
 
	cJSON *heilongjiang = cJSON_CreateObject();
	cJSON *hljcities = cJSON_CreateObject();
	cJSON *hljcityArray = cJSON_CreateArray();
 
	cJSON *guangdong = cJSON_CreateObject();
	cJSON *gdcities = cJSON_CreateObject();
	cJSON *gdcityArray = cJSON_CreateArray();
 
	cJSON *taiwan = cJSON_CreateObject();
	cJSON *twcities = cJSON_CreateObject();
	cJSON *twcityArray = cJSON_CreateArray();
 
	cJSON *xinjiang = cJSON_CreateObject();
	cJSON *xjcities = cJSON_CreateObject();
	cJSON *xjcityArray = cJSON_CreateArray();
	
	cJSON_AddStringToObject(json, "name", "中国");
 
	cJSON_AddStringToObject(heilongjiang, "name", "广西");
	cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("桂林"));
	cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("南宁"));
	cJSON_AddItemToObject(hljcities, "city", hljcityArray);
	cJSON_AddItemToObject(heilongjiang, "cities", hljcities);
 
	cJSON_AddStringToObject(guangdong, "name", "广东");
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("广州"));
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("深圳"));
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("珠海"));
	cJSON_AddItemToObject(gdcities, "city", gdcityArray);
	cJSON_AddItemToObject(guangdong, "cities", gdcities);
 
	cJSON_AddStringToObject(taiwan, "name", "陕西");
	cJSON_AddItemToArray(twcityArray, cJSON_CreateString("宝鸡"));
	cJSON_AddItemToArray(twcityArray, cJSON_CreateString("西安"));
	cJSON_AddItemToObject(twcities, "city", twcityArray);
	cJSON_AddItemToObject(taiwan, "cities", twcities);
 
	cJSON_AddStringToObject(xinjiang, "name", "新疆");
	cJSON_AddItemToArray(xjcityArray, cJSON_CreateString("乌鲁木齐"));
	cJSON_AddItemToObject(xjcities, "city", xjcityArray);
	cJSON_AddItemToObject(xinjiang, "cities", xjcities);
	
	cJSON_AddItemToArray(provinceArray, heilongjiang);
	cJSON_AddItemToArray(provinceArray, guangdong);
	cJSON_AddItemToArray(provinceArray, taiwan);
	cJSON_AddItemToArray(provinceArray, xinjiang);
 
	cJSON_AddItemToObject(json, "province", provinceArray);
 
 
	printf("%s\n", cJSON_Print(json));
 
 
	if ( NULL != json )
	{
		cJSON_Delete(json);
		json = NULL;
	}
	
	return 0;
}

cjson解析

#include <stdio.h>
 
#include "cJSON.h"
#include "cJSON_Utils.h"
 
 
#pragma comment(lib,"cjson.lib")
 
int main(void)
{
 	const char *jsonStr = "{						\
 		\"name\": \"中国\",						\
 		\"province\": [{						\
 			\"name\": \"广西\",					\
 			\"cities\": {						\
 				\"city\": [\"桂林\", \"南宁\"]		\
 			}							\
 		}, {								\
 			\"name\": \"广东\",					\
 			\"cities\": {						\
 				\"city\": [\"广州\", \"深圳\", \"珠海\"]	\
 			}							\
 		}, {								\
 			\"name\": \"陕西\",					\
 			\"cities\": {						\
 				\"city\": [\"宝鸡\", \"西安\"]			\
 			}							\
 		}, {								\
 			\"name\": \"新疆\",					\
 			\"cities\": {						\
 			\"city\": [\"乌鲁木齐\"]				\
 			}							\
 		}]								\
 	}";
 
	cJSON *json = cJSON_Parse(jsonStr);
 
	if ( NULL != json )
	{
		cJSON * temp = cJSON_GetObjectItem(json, "name");
 
		if ( NULL != temp )
			printf( "name : %s\n", temp->valuestring);
 
		temp = cJSON_GetObjectItem(json, "province");
 
		printf( "province : \n");
		if ( NULL != temp )
		{
			int i = 0;
			int icount = cJSON_GetArraySize(temp);
			for (; i < icount; ++i)
			{
				cJSON * province = cJSON_GetArrayItem(temp, i);
 
				if ( NULL != province)
				{
					cJSON * name = NULL;
					cJSON * cities = NULL;
					
					name = cJSON_GetObjectItem(province, "name");
					cities = cJSON_GetObjectItem(province, "cities");
					if ( NULL != name )
						printf("    name : %s\n", name->valuestring);
 
					printf("    cities : \n");
					if ( NULL != cities )
					{
						cJSON * city = cJSON_GetObjectItem(cities, "city");
						printf ("        city:");
						if ( NULL != city )
						{
							int j = 0;
							int jcount = cJSON_GetArraySize(city);
							for (; j < jcount; ++j)
							{
								cJSON *cityItem = cJSON_GetArrayItem(city, j);
								if ( NULL != cityItem )
									printf ("%s ", cityItem->valuestring);
							}
						}
						printf ("\n\n");
					}
				}
			}
		}
 
		cJSON_Delete(json);
		json = NULL;
	}
 
	return 0;
}

参考博客:

  1. 博客一
  2. 博客二

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/113142085