适用于单片机最小JSON解析

selina的头像
selina 发布于:周四, 07/14/2016 - 09:20 ,关键词:


硬件设备由 MCU、MCU 上的 OS、各种传感器、WIFI/蓝牙/3G/4G 以及其他联网通信模块和应用程序构成。 其中硬件设备有两种接入方式, 第一种就是通过联网通信模块接入网关, 通过网关完成数据的发送与接收, 最终将数据转发到云平台或者手机端。 第二种就是硬件设备直接与手机实现本地连接, 进行数据的交换包括配网等操作。 因为云端平台数据传输采用JSON协议,因此,硬件堆JSON的解析非常重要。传统的C JSON解析非常庞大,在微处理器中,这无疑是一个巨大的问题。因此,编写了一个非常简单的JSON你判定,解析,与键值校验的三个纯C语言函数。占用空间非常小。具体的代码如下文所示:

硬件设备由 MCU、MCU 上的 OS、各种传感器、WIFI/蓝牙/3G/4G 以及其他联网通信模块和应用程序构成。 其中硬件设备有两种接入方式, 第一种就是通过联网通信模块接入网关, 通过网关完成数据的发送与接收, 最终将数据转发到云平台或者手机端。 第二种就是硬件设备直接与手机实现本地连接, 进行数据的交换包括配网等操作。

因为云端平台数据传输采用JSON协议,因此,硬件堆JSON的解析非常重要。传统的C JSON解析非常庞大,在微处理器中,这无疑是一个巨大的问题。因此,编写了一个非常简单的JSON你判定,解析,与键值校验的三个纯C语言函数。占用空间非常小。具体的代码如下文所示:

/***************************************

name: JSON C函数库 C文件

***************************************/

#include "include.h"

/***************************************

name: 函数声明

input:

output:

description:

***************************************/

char json_check(char *str); //JSON 校验函数

char json_get_value(char *json,char *json_key , char *json_value); //JSON获取键值

char json_check_value(char *str1, char *str2); //JSON 键值对比函数

/***************************************

name: JSON 校验函数

input: 字符串

output: 合法JAON 返回1 不合法JSON 返回0

description:

***************************************/

char json_check(char *str)

{

char str_length; //定义字符长度变量

str_length = strlen(str); //计算字符长度

if(str[0] == '{' && str[str_length-1] == '}') //通过首尾大括号判断是否为JSON

{

return 1; //如果字符串为合法JSON 返回1

}

else

{

return 0; //如果字符串为合法JSON 返回0

}

}

/***************************************

name: JSON 获取键值函数

input: JSON字符串 要获取的键名 获取键值的字符串

output: 如果获取成功返回1 获取失败返回0

description:

***************************************/

char json_get_value(char *json,char *json_key , char *json_value)

{

char *json_key_start; //定义键名开始的位置

char *json_key_end; //定义键名结束的位置

char json_key_length; //定义键名长度

char *json_value_start; //定义键值开始的位置

char *json_value_end; //定义键值结束的位置

char json_value_length; //定义键值长度

json_key_start = strstr(json,json_key); //获取键名开始的位置

json_key_length = strlen(json_key); //获取键名的长度

json_key_end = json_key_start + json_key_length; //获取键名结束的位置

if(json_key_start != 0 && *(json_key_start - 1) == '\"' && *(json_key_end) == '\"' && *(json_key_end + 1) == ':' && *(json_key_end + 2) == '\"' )

{

json_value_start = json_key_end + 3; //获取键值开始的位置

json_value_end = strstr(json_value_start,"\""); //获取键值结束的位置

json_value_length = json_value_end - json_value_start; //获取键值的长度

strncpy(json_value,json_value_start,json_value_length); //将键值存入指针数组

json_value[json_value_length] = '\0'; //指针最后一位补字符串结束符 \0

return 1; //成功获取键值 返回1

}

else

{

json_value[0] = '\0';

return 0; //失败获取键值 返回0

}

}

/***************************************

name: JSON 键值对比函数

input: JSON 键值 要匹配的字符

output: 如果匹配成功返回1 失败返回0

description:

***************************************/

char json_check_value(char *str1, char *str2)

{

if(strcmp(str1,str2) == 0)

{

return 1; //匹配成功返回1

}

else

{

return 0;

//匹配成功返回0

}

}

© 著作权归作者所有

作者:VIROR

文章来源:开源中国社区

围观 3185