简介:
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 对象表示法语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
cjson常用函数
-
cJSON * cJSON_CreateObject();
创建一个json对象,返回一个cJSON结构体类型的指针。 -
cJSON *cJSON_CreateArray();
创建一个数组对象,返回一个cJSON结构体类型的指针。 -
cJSON *cJSON_CreateString(const char *string);
创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。 -
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象; item为添加入数字对象中的对象指针。 -
void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。 -
cJSON *cJSON_Parse(const char *value);
解析一个json串,传入一个json格式的字符串,返回一个cJSON *类型的结构体指针。 -
char *cJSON_Print(cJSON *item);
将一个cJSON结构体代表的json对象转换为一个json格式的字符串。 -
void cJSON_Delete(cJSON *c);
释放一个cJSON对象所占用的内存空间。 -
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;
}
参考博客: