在Linux下使用cJSON解析JSON

一、JOSN的概念:

  • json指的是JavaScript对象表示法(JavaScript Object Notation)
  • josn是轻量级的文本数据交换格式
  • json独立于语言
  • json具有自我描述性,更易理解

json 使用 JavaScript 语法来描述数据对象,但是 json 仍然独立于语言和平台。json 解析器和 json 库支持许多不同的编程语言。

json的语法规则

json语法简单来说就是四条

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数据

json名称/值对

josn数据的书写格式是:名称:值,这样的一对,即名称在前,该名称的值在冒号后面。例如:

“virteNBName”:“virt1”

这里的名称是“virteNBName”,值是“virt1”,他们均是字符串

名称和值的类型可以有以下几种:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true或false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

json数据由逗号分隔

“virteNBName”:“virt1”, “virteNBNum”:5, “begineNBID”:0这几个对象之间就是使用逗号分隔。

数组内的对象之间当然也是要有逗号分隔。只要是对象之间,分隔就是用逗号,但是,要注意,对象结束的时候,不要加逗号。数组内也是,例如:

[
    {"eRANName":"eNB1", "eRANID":3002, "ctlPort":36412, "dataPort":2152},
    {"eRANName":"eNB2", "eRANID":10000, "ctlPort":36412, "dataPort":2152},
]

上面这个就是错误的,因为在数组中,两个对象之间需要逗号,但是到这个数组末尾了,不需要加逗号了。

josn花括号保存对象

对象可以包含多个名称/值对,如

{“eRANName”:“eNB1”, “eRANID”:3002, “ctlPort”:36412, “dataPort”:2152}

这一点也容易理解,与这条JavaScript语句等价:

“eRANName” = “eNB1”
“eRANID” = 3002
“ctlPort” = 36412
“dataPort” = 2152

josn方括号保存数组

数组可包含多个对象:

"eRAN":[
    {"eRANName":"eNB1", "eRANID":3002, "ctlPort":36412, "dataPort":2152},
    {"eRANName":"eNB2", "eRANID":10000, "ctlPort":36412, "dataPort":2152}
]

在上面的例子中,对象“eRAN” 是包含个对象的数组,每个对象代表一条基站的记录。

最后我们要知道json文件的类型为“.json”

二、cjosn的介绍

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

那么我们为什么选择cJSON来解析JSON字符串那?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.C文件和一个.h文件!并且文件体积大小不到K。源码思路也非常清晰,也非常适合研究。

我们可以通过此链接下载cJOSN:https://sourceforge.net/projects/cjson/

当我们下载好cJSON只需要把.C文件和.h文件包含文件拷贝到我们工程目录下,我们就可以使用了。

cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了,该结构体具体定义如下:

typedef struct cJSON {
   

       struct cJSON*next,*prev;           /* 遍历数组或对象链的前向或后向链表指针*/

       struct cJSON *child;                   /*数组或对象的孩子节点*/

       int type;                                     /* key的类型*/

       char *valuestring;                       /*字符串值*/

       int valueint;                                /* 整数值*/

       double valuedouble;                    /* 浮点数值*/

       char *string;                               /* key的名字*/

} cJSON;

说明:

  1. cJSON是使用链表来存储数据的,其访问方式很像一棵树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。

  2. type是键(key)的类型,一共有种取值,分别是:False,True,null,Number,String,Array,Object。
    若是Number类型,则valueint或valuedouble种存储着值,如期望的是int,则访问valueint,如期望的是double,则访问valuedouble,可以得到值。
    若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。

  3. string中存放的是这个节点的名字,可以理解位key的名称。

三、 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 *结构体类型的指针&#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值