关于esp8266自带json的使用
(2017-03-21 12:38:29)分类: MQTT |
近段时间用到json封装一些数据,所以就使用了博主“阿秀”,给的一个例子(http://blog.csdn.net/yannanxiu/article/details/50911357),这其间因为一些小的问题,自己折腾了一些时间,看了一些源代码,下面分享一点自己的见解,相互学习。
首先要提到的是几个宏定义,
(1) JSONTREE_CALLBACK,根据结构体
struct jsontree_callback {
uint8_t
type;
int (*
output)(struct jsontree_context *js_ctx);
int (*
set)(struct jsontree_context *js_ctx, struct jsonparse_state
*parser);
};
它要注册两个回调函数,分别用于生成json格式数据和解析json格式数据,在解析时,有一个函数json_parse(),会调用注册的set函数,解析数据。另外我们在解析json数据时,会先调用jsontree_setup()函数,个人认为作用在于生成一个我们之前定义的json对象,而这个对象作为json_parse()的一个参数,用于从中得到用于解析的回调函数。在json_parse()函数中随后会调用jsonparse_setup()函数生成解析树,并调用set函数解析。
(2)JSONTREE_OBJECT
这个宏定义存储了对象中的键值对以及个数,在生成json数据中,调用json_ws_send()函数,用于从对象中取得键值对,这里传给json_ws_send()函数的是json数据的最上层对象,在函数中调用find_json_path()获取每一个对象的键值对存入一个结构体
struct jsontree_context {
struct
jsontree_value *values[JSONTREE_MAX_DEPTH];
uint16_t
index[JSONTREE_MAX_DEPTH];
int (*
putchar)(int);
uint8_t
depth;
uint8_t
path;
int
callback_state;
};
同时获取结构体中数据缓存到数组中。
有了这些基本的封装和解析尝试,便可以将封装的数据publish到代理,同时subscribe数据,并解析获取想要数据。
首先要提到的是几个宏定义,
(1) JSONTREE_CALLBACK,根据结构体
struct jsontree_callback {
};
它要注册两个回调函数,分别用于生成json格式数据和解析json格式数据,在解析时,有一个函数json_parse(),会调用注册的set函数,解析数据。另外我们在解析json数据时,会先调用jsontree_setup()函数,个人认为作用在于生成一个我们之前定义的json对象,而这个对象作为json_parse()的一个参数,用于从中得到用于解析的回调函数。在json_parse()函数中随后会调用jsonparse_setup()函数生成解析树,并调用set函数解析。
(2)JSONTREE_OBJECT
这个宏定义存储了对象中的键值对以及个数,在生成json数据中,调用json_ws_send()函数,用于从对象中取得键值对,这里传给json_ws_send()函数的是json数据的最上层对象,在函数中调用find_json_path()获取每一个对象的键值对存入一个结构体
struct jsontree_context {
};
同时获取结构体中数据缓存到数组中。
有了这些基本的封装和解析尝试,便可以将封装的数据publish到代理,同时subscribe数据,并解析获取想要数据。
前一篇:free()函数的理解
后一篇:ping程序