概述
@[TOC]**
自编适用于嵌入式单片机Json封包与解析的程序
**
说明:
由于网上提供的标准JSON库,对向单片机这类的小设备占用资源过多,很不实际,所以用C语言自编,在平台STM32F103和Keil5上运行测试本程序。
设计思想:
创建一个数组,将JSON符号和键值对,按JSON标准格式直接写入数组中进行封包,解析同理,通过直接在JSON数据包中查找的方式,找到键所对应的值,不另开内存暂存。
现附上源码:
一,头文件
#ifndef __myJson_H
#define __myJson_H
#include “main.h”
#define my_u8 uint8_t
#define my_u16 uint16_t
#define my_u32 uint32_t
//------------------------------------Json解码,占很少内存------------------------------------------------------
enum Vile_type
{
JsonVile_type_NuLL = 0,//无数据
JsonVile_type_Number,//10进制数据
JsonVile_type_S,//字符串
JsonVile_type_C,//字符(无双引号)
JsonVile_type_Bool,//布尔型
JsonVile_type_Null,//Null型
};//没有对Json对象得取值
typedef struct Json_GetVile
{
my_u8 Vile_type;//得到的值类型
float Vile_Number;//10进制数据
my_u8 *pSC_Null;//串型数据地址或者Null 根据Vile_type存储响应的数据
my_u16 SC_Lenth_Bool;//数据长度或者Bool
}myJson_GetVile_t;
//在Json数据包中得到键pKey_Str的地址 对于有多个子节点的,缩短查找时间,相当于取一个Json对象
my_u8 *myJson_GetFather_Address(my_u8 *pJson_Pack,my_u16 PackLenth,char *pKey_Str);
//在Json数据包中得到键pKey_Str的值
myJson_GetVile_t *myJson_GetVile(my_u8 *pJson_Pack,char *pKey_Str);//用完free
//------------------------------------Json封包,占很少内存------------------------------------------------------
typedef struct JsonPack //对外接口
{
my_u8 *pJsonPack;//指向封包数组
my_u16 JsonPack_Lenth;//封包数组中字符串的长度
}JsonPack_t;
//对Json数据进行封包,
void myJson_Pack(JsonPack_t *JsonPack,char *pForMart,char *pForMart_Str,char **pForMart_ArryS,char **pForMart_ArryC,float *pForMart_ArryNumber);//
//Json格式化输出方便调试
void myJson_ForMart_Printf(JsonPack_t *JsonPack);//用Json格式输出 方便查看
#endif
二,源文件:
#include “myJson.h”
#include “stdlib.h”
1.共用工具源文件:
/*******************************************
程序功能:计算pStr字符串长度,返回pStr字符串长度
@pStr:被计算的字符串,可以包含0,0的连续个数<=10
@pStr_Lenth:被计算字符串分配空间长度,可以用sizeof关键字,若被计算的字符串不包含0,pStr_Lenth =0
说明:
*******************************************/
my_u16 myStrlen_Inc0(my_u8 *pStr,my_u16 pStr_Lenth)//计算字符串长度 数组包含0也无防
{
my_u16 Lenth = 0;
my_u8 Lenth_0 = 0;
if(!pStr_Lenth)
{
while(*pStr !='