JSON的使用

1.JSON通信协议的概念

2.JSON的语法

2.1JSON对象

2.2JSON数组

2.3JSON字符串

3.JSON的使用与解析

3.1JSON结构体

3.2JSON格式的使用

3.3JSON格式的解析

1.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建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这两种结构是常见的JSON数据结构,同时在不同的语言中也都是相通使用的。

JSON的语法JavaScript 语法的子集:

键/值对 key:value,用半角冒号分割。 比如 “Email”:“110”

数据由逗号分隔

大括号保存对象,也称为一个文档对象

中括号保存数组 ,数组成员可以是对象,值,也可以是数组(只要有意义)。 {“paly”: [“斗地主”,“王者”,“吃鸡”]}

2.1JSON对象

对象?你会想我一个单身狗哪里来的对象,哈哈!

当然,这和C++中的对象不太一样。

对象是一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔。

对象可以包含多个 key/value(键/值)对。其中key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。key 和 value 中使用冒号(:)分割。每个 key/value 对使用逗号(,)分割。

如下:

{ "play":"football" , "run": 10000 }

如果想要访问其中的内容可以使用"."访问:var x = play.football

2.2JSON数组

数组是值(value)的有序集合。一个数组以 [左中括号 开始, ]右中括号 结束。值之间使用 ,逗号 分隔。

数组可包含多个对象。这里数组就是大哥了,对象可以是它的小弟了

JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。

如下:

{

"game":[

{ "name":"和平精英" , "user":"eveybody" },

{ "name":"王者荣耀", "user":"youngman"}

]

}

2.3JSON字符串

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。盗图如下:

3.JSON的使用与解析

在我们使用JSON通信协议之前,有很多东西是不用我们自己写的,直接下载相应的cJSON.c文件和cJSON.h就可以使用了,在使用的时候只需要调用.c文件中相应的功能函数就可以了。

下载地址:https://gitee.com/sample_commander/G4-module-SMS-cat/tree/master/socket

CJSON 作为JSON格式的解析库,功能无外乎构建和解析JSON格式,采用CJSON的设备,以JSON的格式发送数据,收到JSON格式的数据,解析成可供应用识别的功能。

3.1JSON结构体

JSON结构体也是写在cJSON.c文件中的,但是这也是一个非常重要的结构体,必须了解才能使用。

/* The cJSON structure: */

typedef struct cJSON

{

/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */

struct cJSON *next;

struct cJSON *prev;

/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

struct cJSON *child;

/* The type of the item, as above. */

int type;

/* The item's string, if type==cJSON_String and type == cJSON_Raw */

char *valuestring;

/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */

int valueint;

/* The item's number, if type==cJSON_Number */

double valuedouble;

/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */

char *string;

} cJSON;

/* cJSON Types: */

#define cJSON_Invalid (0)

#define cJSON_False (1 << 0)

#define cJSON_True (1 << 1)

#define cJSON_NULL (1 << 2)

#define cJSON_Number (1 << 3)

#define cJSON_String (1 << 4)

#define cJSON_Array (1 << 5)

#define cJSON_Object (1 << 6)

#define cJSON_Raw (1 << 7)/* raw json */

cJOSN结构体为一个双向链表,并可通过child指针访问下一层。

.type :变量决定数据项类型(键的类型)

valuestring / valueint / valuedouble: 数据项 依次表示是字符串/是整形/浮点型

string : 节点名称,或理解为“键(key)”。

3.2JSON格式的使用

JSON格式的使用其实很简单,就算调用cJSON中的函数即可:

从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value);

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

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

最简单的使用就是这三步就可以了,但是需要注意的是解析一块JSON数据返回cJSON结构,在使用完之后调用cJSON_Delete函数释放json对象结构。

创建一个值类型的数据:

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());

在了解了这些基本的知识后,我们来看一个简单的实例,这里我把这个文件取名为pack_json.c,即打包:

#include

#include

#include

#include"cJSON.h"//这里包含一下cJSON.c的头文件,直接下载使用

int main(int argc, char **argv)

{

char *data;

cJSON *json;

char *json_data = NULL;

data = "{\"Mobile\":[\"13885761500\"],\"中文短信\":[\"你好\"], \"English_SMS\":[\"hello\"]}";

//从缓冲区中解析出JSON结构

json= cJSON_Parse(data);

//将传入的JSON结构转化为字符串 并打印

json_data = cJSON_Print(json);

printf("data:%s\n",json_data);

//将JSON结构所占用的数据空间释放

free(json_data);

cJSON_Delete(json);

return 0;

}

在我们的Linux下写好这个c文件之后我们就可以编译了,但是编译的时候得加上cJSON.c这个文件gcc pack_json.c cJSON.c

输出结果如下:

3.3JSON格式的解析

当我们接收到一个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)

那么现在我们假如接收到上面那个的数据,我们来解析一下,我取名为unpack_json.c,即解包:

#include

#include

#include

#include"cJSON.h"//同样的,这里需要包含这个头文件

int main(int argc, char **argv)

{

cJSON *tnode = NULL;

char *string = "{\"Mobile\":[\"18585761500\"], \"中文短信\":[\"你好\"], \"English_SMS\":[\"hello\"]}";

cJSON *json = cJSON_Parse(string);

cJSON *node = NULL;

node = cJSON_GetObjectItem(json,"Mobile"); //查找第一个节点

if(node == NULL)

{

printf("Mobile node == NULL\n");

return -1;

}

if(1 != cJSON_HasObjectItem(json,"Mobile"))

{

printf("not found Mobile node\n");

return -2;

}

cJSON_ArrayForEach(tnode,node)

{

if(tnode->type == cJSON_String)

{

printf("The mobile is:%s\n",tnode->valuestring);

}

else

{

printf("node's type is not string\n");

}

}

node = cJSON_GetObjectItem(json,"中文短信");

if(node == NULL)

{

printf("中文短信 node is NULL\n");

return -3;

}

if(1 != cJSON_HasObjectItem(json,"中文短信"))

{

printf("not found 中文短信 node\n");

return -4;

}

cJSON_ArrayForEach(tnode,node)

{

if(tnode->type == cJSON_String)

{

printf("The mobile is:%s\n",tnode->valuestring);

}

else

{

printf("node's type is not string\n");

}

}

node = cJSON_GetObjectItem(json,"English_SMS");

if(node == NULL)

{

printf("English_SMS node is NULL\n");

return -6;

}

if(1 != cJSON_HasObjectItem(json,"English_SMS"))

{

printf("not found English_SMS node\n");

return -7;

}

cJSON_ArrayForEach(tnode,node)

{

if(tnode->type == cJSON_String)

{

printf("The English_SMS is:%s\n",tnode->valuestring);

}

else

{

printf("node's type is not string\n");

return -1;

}

}

return 0;

}

写完程序后,编译的时候同样的要加入cJSON.c文件一起编译,结果如下:

linux解析json指针,Linux下JSON通信协议的使用和解析相关推荐

  1. python3 json安装_python3下JSON和JsonPath

    1.1   JSON介绍 json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构. 1. 对象:对象在js中表示为{ }括起来 ...

  2. linux下json数据解析,Linux下使用jq简单解析json的方法

    jq简介 jq 是一款命令行下处理 JSON 数据的工具.其可以接受标准输入,命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出 ...

  3. linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

    在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...

  4. linux命令行下如何格式化json并进行各种json处理操作

    有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理.总结. 在Linux系统下基于python json.tool可以格式化json,使用jq工具可 ...

  5. abi:用json解析和对比linux平台下elf文件

    目录 引言 parse_elf_jsonc.c compare_elf_cJSON.cpp 引言 前段时间接触到了跟abi(注意不是api)相关的知识,简单的了解了一下elf文件格式并写了两个小样例. ...

  6. JavaWeb笔记:第07章 MVC |EL |JST |Filter |Listener |JQuery |AJAX |Maven |JSON |Redis |Linux |Nginx

    JavaWeb笔记:第07章 MVC |EL |JST |Filter |Listener |JQuery |AJAX |Maven |JSON |Redis |Linux |Nginx 1. MVC ...

  7. Linux系统json文件打中文,如何在 Linux 终端上漂亮地打印 JSON 文件

    JSON 文件非常棒,因为它们以人类可读的格式存储数据集合.然而,如果 JSON 文件被最小化过,那么阅读 JSON 文件可能会很痛苦. • 来源:linux.cn • 作者:Abhishek Pra ...

  8. Python 下JSON的两种编解码方式实例解析

    概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: 使 ...

  9. android中json解析及使用 (下)

    接上文 七.通过JSONTokener来解析json文本 7.1.将json文本解析为对象 我们可以通过JSONTokener的nextValue()来获得JSONObject对象,然后再通过JSON ...

最新文章

  1. 网络与服务器编程框架库 acl_3.0.13 发布
  2. 如何卸载安装有问题的devexpress组件?
  3. 2.4 使用来自不同分布的数据,进行训练和测试-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  4. VMware Workstation 中 用NAT 方式设置网络
  5. Linux提升系统安全性:自动注销 TMOUT
  6. python验证码重叠_用Python机器学习搞定验证码
  7. dart开发Android服务,关于android:在Flutter应用中使用由swagger生成的Dart代码生成的Web服务...
  8. log4j日志文件 log4j.xml log4j.properties配置
  9. python server酱_用Python抢到回家的车票,so easy
  10. 现在论文用手写还是用计算机写,毕业论文计算机手写数字识别技术完整版.docx...
  11. CSS属性:display详解
  12. tp5 admin.php,TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统
  13. java漫画pdf_Java并发编程学习宝典(漫画版)(PDF+HTML完结)
  14. Rocketmq 消息的同步发送,异步发送,oneway方式
  15. python中欧拉-罗德里格斯的代码详解
  16. 安卓029老年人监护系统APP
  17. 使用Eclipse创建Java应用程序,实现从控制台输出多行信息:姓名、年龄、爱好
  18. L1-040 最佳情侣身高差(Python3)
  19. baby_web (攻防世界)
  20. 美国标准的网络安全体系架构

热门文章

  1. Windows平台下tomcat+java的web程序持续占cpu问题调试
  2. 2017-10-08 前端日报
  3. 分布式光伏贷款欲破冰 多家银行推出相关业务
  4. [C++设计模式] proxy 代理模式
  5. 2016.03.18 近日买房以及学习事项
  6. [2767]翻转排序 sdutOJ
  7. java开发_读写txt文件操作
  8. WARNING:Result from SERVER not valid. Partial Result:
  9. 原创内容将成网络视频的一支奇军
  10. Delphi 两种类的声明方法