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

1. JSON概述

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 具有自我描述性, 语法简洁, 易于理解。


2. JSON语法说明


先来看一个简单的JSON:

{
  "stars": [
    {
      "name": "Faye",
      "address": "北京"
    },
    {
      "name": "andy",
      "address": "香港"
    },
    {
      "name": "eddie",
      "address": "台湾"
    },

  ]
}

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库下载地址 :附cJSON库下载地址

cJSON库在使用的时候只需要如下两步:将cJSON.c(或者库文件) 和 cJSON.h添加到项目中即可;如果在命令行中进行链接 还需要加上-lm 表示链接math库 .


3. 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)) 

4. 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)  


5. 实验


编写一个输出到屏幕的简单json结构,代码1如下:

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

int main(void)
{
    char *data = "{\"love\":[\"LOL\",\"Go shopping\"]}";
    //从缓冲区中解析出JSON结构
    cJSON * json= cJSON_Parse(data);

    //将传入的JSON结构转化为字符串 并打印
    char *json_data = NULL;
    printf("data:%s\n",json_data = cJSON_Print(json));

    free(json_data);
    //将JSON结构所占用的数据空间释放
    cJSON_Delete(json);
    return 0;
}

如下所示编译程序,执行程序,可以看到屏幕输出一个简单的json结构
在这里插入图片描述
下面我们在改进一下程序,输出到屏幕的同时,生成对应的json文件,代码2如下:

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

int main(void)
{
    char *char_json = "{\"habit\":\"lol\"}";
    //从缓冲区中解析出JSON结构
    cJSON *json = cJSON_Parse(char_json);
    //将传入的JSON结构转化为字符串 并打印
    char *buf = NULL;
    printf("data:%s\n",buf = cJSON_Print(json));
    //打开一个exec.json文件,并写入json内容
    FILE *fp = fopen("exec.json","w");
    fwrite(buf,strlen(buf),1,fp);

    fclose(fp);
    free(buf);
    cJSON_Delete(json);
    return 0;
}

如下图所示进行编译,执行程序,查看生成的对应的json文件
在这里插入图片描述
下面我们生成一个生成一个json结构稍微复杂一点的json文件,代码3如下:

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

int main(void)
{
    //创建一个空的文档(对象)
    cJSON *json = cJSON_CreateObject();

    //向文档中增加一个键值对{"name":"王大锤"}
    cJSON_AddItemToObject(json,"name",cJSON_CreateString("王大锤"));
    //向文档中添加一个键值对
    //cJSON_AddItemToObject(json,"age",cJSON_CreateNumber(29));
    cJSON_AddNumberToObject(json,"age",29);

    cJSON *array = NULL;
    cJSON_AddItemToObject(json,"love",array=cJSON_CreateArray());
    cJSON_AddItemToArray(array,cJSON_CreateString("LOL"));
    cJSON_AddItemToArray(array,cJSON_CreateString("NBA"));
    cJSON_AddItemToArray(array,cJSON_CreateString("Go shopping"));

    cJSON_AddNumberToObject(json,"score",59);
    cJSON_AddStringToObject(json,"address","beijing");

    //将json结构格式化到缓冲区
    char *buf = cJSON_Print(json);
    //打开文件写入json内容
    FILE *fp = fopen("create.json","w");
    fwrite(buf,strlen(buf),1,fp);
    free(buf);
    fclose(fp);
    //释放json结构所占用的内存
    cJSON_Delete(json);
    return 0;
}

编译程序,执行程序,查看生成的json文件
在这里插入图片描述
下面再来编写一个,代码4如下:

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

int main(void)
{
    //先创建空对象
    cJSON *json = cJSON_CreateObject();
    //在对象上添加键值对
    cJSON_AddStringToObject(json,"country","china");
    //添加数组
    cJSON *array = NULL;
    cJSON_AddItemToObject(json,"stars",array=cJSON_CreateArray());
    //在数组上添加对象
    cJSON *obj = NULL;
    cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
    cJSON_AddItemToObject(obj,"name",cJSON_CreateString("Faye"));
    cJSON_AddStringToObject(obj,"address","beijing");
    //在对象上添加键值对
    cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
    cJSON_AddItemToObject(obj,"name",cJSON_CreateString("andy"));
    cJSON_AddItemToObject(obj,"address",cJSON_CreateString("HK"));

    cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
    cJSON_AddStringToObject(obj,"name","eddie");
    cJSON_AddStringToObject(obj,"address","TaiWan");

    //清理工作
    FILE *fp = fopen("create.json","w");
    char *buf = cJSON_Print(json);
    fwrite(buf,strlen(buf),1,fp);
    fclose(fp);
    cJSON_Delete(json);
    return 0;
}

编译执行程序4,效果如下图所示:
在这里插入图片描述
下面我们来一个解析的例子,代码5如下:

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

int main(void)
{
    char *string = "{\"family\":[\"father\",\"mother\",\"brother\",\"sister\",\"somebody\"]}";
    //从缓冲区中解析出JSON结构
    cJSON *json = cJSON_Parse(string);
    cJSON *node = NULL;
    //cJOSN_GetObjectItem 根据key来查找json节点 若果有返回非空
    node = cJSON_GetObjectItem(json,"family");
    if(node == NULL)
    {
        printf("family node == NULL\n");
    }
    else
    {
        printf("found family node\n");
    }
    node = cJSON_GetObjectItem(json,"famil");
    if(node == NULL)
    {
                printf("famil node == NULL\n");
        }
    else
        {
                printf("found famil node\n");
        }
    //判断是否有key是string的项 如果有返回1 否则返回0
    if(1 == cJSON_HasObjectItem(json,"family"))
    {
        printf("found family node\n");
    }
    else
    {
        printf("not found family node\n");
    }
    if(1 == cJSON_HasObjectItem(json,"famil"))
        {
                printf("found famil node\n");
        }
        else
        {
                printf("not found famil node\n");
        }

    node = cJSON_GetObjectItem(json,"family");
    if(node->type == cJSON_Array)
    {
        printf("array size is %d",cJSON_GetArraySize(node));
    }
    //非array类型的node 被当做array获取size的大小是未定义的行为 不要使用
    cJSON *tnode = NULL;
    int size = cJSON_GetArraySize(node);
    int i;
    for(i=0;i<size;i++)
    {
        tnode = cJSON_GetArrayItem(node,i);
        if(tnode->type == cJSON_String)
        {
            printf("value[%d]:%s\n",i,tnode->valuestring);
        }
        else
        {
            printf("node' type is not string\n");
        }
    }

    cJSON_ArrayForEach(tnode,node)
    {
        if(tnode->type == cJSON_String)
        {
            printf("int forEach: vale:%s\n",tnode->valuestring);
        }
        else
        {
            printf("node's type is not string\n");
        }
    }
    return 0;
}

编译程序,执行程序5,解析出json信息如下图所示,
在这里插入图片描述
原文地址:原文地址
https://www.cnblogs.com/liunianshiwei/p/6087596.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值