转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html

JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。

JSON基于两种结构:
    “名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
    值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。

JSON的三种语法:

    键/值对 key:value,用半角冒号分割。 比如 "name":"Faye" 
    文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。 
    数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]}

附cJSON库下载地址 https://github.com/DaveGamble/cJSON

如何在自己的项目中使用cJSON库:

将cJSON.c(或者库文件) 和 cJSON.h添加到项目中即可;

C语言函数库写JSON文件 :

    从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value); 
    解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

    将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item); 
    可用于输出到输出设备, 使用完之后free(char *) 。

    将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)

    创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
                extern cJSON *cJSON_CreateString(const char *string);
                extern cJSON *cJSON_CreateArray(void);

    创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);

    数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
              void cJSON_AddItemToArray(cJSON *array, cJSON *item);

    JSON嵌套 :

          【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
          【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
          【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());

    几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n) \
                        cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
                   #define cJSON_AddStringToObject(object,name,s)\
                        cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

C语言库函数解析JSON文件 :

    根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

    判断是否有key是string的项 如果有返回1 否则返回0 :

extern int cJSON_HasObjectItem(cJSON *object,const char *string)
                      { return cJSON_GetObjectItem(object,string)?1:0; }

    返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);

    根据数组下标index取array数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

    遍历数组 :#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next) 

例子:

1.解析json

void CParsejson()
{
char* data = "{\"name\":\"Messi\",\"age\":\"29\"}";
//从缓冲区中解析json结构
cJSON* root = cJSON_Parse(data); if (data == NULL)
{
return;
} cJSON* itemName = cJSON_GetObjectItem(root, "name"); if (itemName)
{
cout << "name: "<< itemName->valuestring << endl;
} cJSON* itemAge = cJSON_GetObjectItem(root, "age");
if (itemAge)
{
cout << "age: " << itemAge->valuestring << endl;
}
//讲json结构占用的数据空间释放
cJSON_Delete(root);
} int main()
{
CjsonTest1();
return ;
}

运行结果:

2.讲json数据写入文件

void WriteJson()
{
char *char_json = "{\"hello\":\"你好\"}"; //从缓冲区中解析出JSON结构
cJSON *json = cJSON_Parse(char_json); if (json == NULL)
{
return;
} //将传入的JSON结构转化为字符串
char *buf = NULL;
buf = cJSON_Print(json); //打开一个info.json文件,并写入json内容
FILE *fp = fopen("info.json", "w");
fwrite(buf, strlen(buf), , fp); fclose(fp);//关闭文件
free(buf);//释放资源
cJSON_Delete(json);//释放资源
} int main()
{
WriteJson();
return ;
}

文件内容:

3.代码生成json

 

cJSON库的简单介绍及使用的更多相关文章

  1. app 下载更新 file-downloader 文件下载库的简单介绍和使用

    app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...

  2. 嵌入式 Linux下curl库API简单介绍

    1:CURLcode curl_global_init(long flags); 这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_ ...

  3. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

  4. JSON的简单介绍以及C语言的JSON库使用

    JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...

  5. FreeSWITCH第三方库(其他)的简单介绍(三)

    FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...

  6. GitHub开源库排名一百的简单介绍,值得收藏!

    GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...

  7. 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍

    **************************************************************************************************** ...

  8. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  9. professional cuda c programming--CUDA库简单介绍

    CUDA Libraries简单介绍   上图是CUDA 库的位置.本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND.之后会介绍OpenACC. cuSPARSE线性代数库,主要针 ...

随机推荐

  1. 39.css3----button按钮点击时出现蓝色边框

    css控制Button 按钮的点击时候出现蓝色边框http://www.inbeijing.org/archives/1139 Button 按钮的点击时候出现蓝色边框的问题 添加css属性,这样在点 ...

  2. sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)

    (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...

  3. 从0开始搭建vue+webpack脚手架(三)

    在从0开始搭建vue+webpack脚手架(二)中已经基本完成了开发环境的配置.当开发完成后,我们需要将完成的项目进行打包,接下来对打包做一些优化: 运行 $ npm run build 可生成dis ...

  4. SSH异常处理(一)

    Could not locate getter method for property [com.test_SSH.Employee#createTime] 这个异常是实体类没有映射到对应的.hbm. ...

  5. mac install wget

    没有Wget的日子是非常难过的,强大的Mac OS 下安装Wget非常简单 下载一个Wget的源码包,http://www.gnu.org/software/wget/ ftp下载地址:ftp://f ...

  6. tp命名空间

    namespace   Home\Controller;  命名空间   根命名空间下的类所在的文件夹use Think\Controller; 使用   根命名空间下的controller类 顶头写 ...

  7. Openstack CentOS6.5 ALL IN ONE 安装

    本文档以RDO的方式安装单节点.单网卡的Openstack. RDO是可在Red Hat Enterprise Linux.Fedora及其变体上运行的社区支持OpenStack版本.部署简单方便,R ...

  8. 01 while 循环输入1 2 3 4 5 6 8 9 10

      start = 1while True:    if start == 7:        start += 1        continue    print(start)    start ...

  9. Thinking-Bear magic (计算几何)

    ---- 点我 ---- 题目大意: 给你一个正n边形及边长 a和一个正整数L, 求正多边形的面积s,若s大于L,则连接相邻两边的中点,形成新的正多边形,重复这个操作直至s小于L:如图: 正多边形的面 ...

  10. Sitecore CMS中如何管理默认字段值

    在Sitecore CMS中管理默认字段值. 在创建内容时,自定义默认值对内容编辑者特别有用.通过指定良好的默认值,新创建的项目可以预先填充数据,以便内容编辑者不必浪费时间一遍又一遍地填充相同的字段. ...