cjson

物联网项目设计(四)cJSON 在 STM32 移植和使用

别等时光非礼了梦想. 提交于 2020-02-28 05:13:15
概要 JSON格式是互联网通讯过程中常用的格式。包括MQTT协议也不例外,MQTT协议的数据收发都是使用JSON格式完成的。在使用MQTT协议进行通讯之前,我们需要掌握在c语言环境下JSON格式数据的操作。对JSON数据的操作我们使用了cJSON开源库。在使用的过程中,也遇到了不少问题(见后文),为此我查阅了很多资料,最后找到比较简单的方法解决了这个问题。 本篇介绍如何生成cJSON格式数据,并转化成字符串,通过串口发送到上位机。 关于cJSON的介绍和使用说明,这里推荐 另外一篇博文 。 下面是cJSON的源码github 地址 准备阶段 硬件准备 使用STM32主控的开发板或相关硬件设备 软件准备 上位机串口助手 实际操作步骤 1.使用CubeMx建立一个简单的工程,只需要配置串口, 但一定要注意,配置堆栈大小的时候一定要配置的大一点,因为cJSON分配内存的时候会占用不少内存空间,内存分配是单片机移植cJSON遇到的最常见的问题,如果内存分配的不对,很容易就导致生成的JSON字符串里面什么都没有。网上很多解决方案是自行编写内存管理函数,也就是malloc和free,这种方法太麻烦而且可移植性不高,最后我选择了使用增大堆栈的方式。 2.从github上获取cJSON的源码并解压,如下图 我们只需要其中的cJSON.c和cJSON.h,并把他们复制到工程中。 3.实际编写代码部分

使用Python将字符串转换为JSON

岁酱吖の 提交于 2020-02-27 07:51:48
我对Python中的JSON感到有些困惑。 在我看来,这就像是一本字典,因此我正在尝试这样做: { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } 但是当我 print dict(json) ,它给出了一个错误。 如何将该字符串转换为结构,然后调用 json["title"] 以获取“示例词汇表”? #1楼 当我开始使用json时,我很困惑,无法在一段时间内弄清楚,但最终我得到了想要的东西 这是简单的解决方案 import json m = {'id'

cJSON: 只能处理 utf-8 编码的 json

一曲冷凌霜 提交于 2020-02-26 10:01:44
使用 cJSON 也有三四年了,之前一直没注意到 cJSON 对 json 数据的编码有什么要求。 我有时用来处理 gbk 编码,有时处理 utf-8 编码,没遇到什么问题。 直到前不久,才发现一个问题。 这个 json 数据中有一个汉字:' 黒 ' json 数据本身是 gbk 编码,在使用 cJSON 解析后,并没有按预期输出一个 '黒', 输出了一个问号 '?' 然后到网上查了一下,看到官网的提示,原来 cJSON 只能处理 utf-8 编码的数据。 为什么我在解析很多别的汉字的时候,使用 gbk 编码没有问题呢? 网上也看到有相关的说明,关于 cJSON 的解析原理,我也不想多说什么了。 算了, 以后只需记住一点,提交给 cJSON处理的数据一定要是 utf-8 编码就行了。 来源: https://www.cnblogs.com/personnel/p/12365180.html

How to check for nil/null in Redis' Lua cjson?

旧巷老猫 提交于 2020-02-16 05:15:29
问题 I have a lua script with code block as below: local call_data = cjson.decode(ARGV[1]) local other_data = cjson.decode(ARGV[2]) local data = {} local next = next local populate_data = function(source) if next(source) == nil then return end for property,value in pairs(source) do redis.call('HSET', KEYS[2], property, value) end end populate_data(call_data) populate_data(other_data) When I try to run the script with the following command KEYS and ARGV as:- redis-cli --eval dialed.lua "inflight

How to check for nil/null in Redis' Lua cjson?

你离开我真会死。 提交于 2020-02-16 05:14:48
问题 I have a lua script with code block as below: local call_data = cjson.decode(ARGV[1]) local other_data = cjson.decode(ARGV[2]) local data = {} local next = next local populate_data = function(source) if next(source) == nil then return end for property,value in pairs(source) do redis.call('HSET', KEYS[2], property, value) end end populate_data(call_data) populate_data(other_data) When I try to run the script with the following command KEYS and ARGV as:- redis-cli --eval dialed.lua "inflight

cJSON库的使用(二)

戏子无情 提交于 2020-02-15 01:33:12
一、C语言库函数解析json文件(已知json文件解析数据) 1、首先了解cJSON结构体的结构(双向链表实现) /* The cJSON structure: */ typedef struct cJSON { /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *next;//next,prev:双向链表的前后结点 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

json压缩算法: CJSON和HPack

≡放荡痞女 提交于 2020-02-14 11:12:01
JSON和CJSON CSJON使用自动类型提取压缩JSON。解决重复key名称问题。 [ { // This is a point "x": 100, "y": 100 }, { // This is a rectangle "x": 100, "y": 100, "width": 200, "height": 150 }, {}, // an empty object ] 可以被压缩为 { "templates": [ [0, "x", "y"], [1, "width", "height"] ], "values": [ { "values": [ 1, 100, 100 ] }, { "values": [2, 100, 100, 200, 150 ] }, {} ] } JSON和HPack hpack是一个无损、跨语言、注重性能的数据集压缩程序。它能够将用于表示泛型同构集合的字符数减少70%。 此算法提供了多个级别的压缩(从0到4)。 级别0压缩通过从结构中删除键(属性名)来执行最基本的压缩,该结构在索引0上创建一个具有每个属性名的头。下一个级别允许通过假设存在重复的条目来进一步减小JSON的大小。 [{ name : "Andrea", age : 31, gender : "Male", skilled : true }, { name : "Eva", age :

STM32驱动SDIO WIFI 介绍(十六) ---- 上位机UDP操作/代码

最后都变了- 提交于 2020-01-29 06:59:04
代码工程的GITHUB连接: 点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi Marvell自己实现驱动系列文章分为几篇介绍: SDIO wifi Marvell8801/Marvell88w8801 介绍(一) ---- 芯片介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- 寄存器介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- 命令/事件/数据格式 SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- TLV SDIO wifi Marvell8801/Marvell88w8801 介绍(六) ---- 实现初始化功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(七) ---- 实现搜索功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(八) ---- 实现STA功能 SDIO wifi Marvell8801

cjson创建数组

纵然是瞬间 提交于 2019-12-30 19:09:12
这里介绍如何使用cjson,创建一个含数组的json字串。例如下面的形式: { "UnixSocket": [ { "id":0, "value":10.0 } ] } 干脆一些,直接上代码: int Jsondata_Create_Json(char *pBuf, int id, int type, int value, float fvalue) { cJSON *root; cJSON *Array; cJSON *objId; char *pStr; int ret; memset(pBuf, 0, sizeof(pBuf)); root = cJSON_CreateObject(); Array = cJSON_CreateArray(); objId = cJSON_CreateObject(); cJSON_AddNumberToObject(objId, "id", id); if(type == Value_Int) { cJSON_AddNumberToObject(objId, "value", value); } else { cJSON_AddNumberToObject(objId, "value", fvalue); } cJSON_AddItemToArray(Array, objId); cJSON_AddItemToObject(root,

Should the return value of cJSON_Print() be freed by the caller?

☆樱花仙子☆ 提交于 2019-12-23 22:44:03
问题 I am using the cJSON library and I have a function as follows: void printJsonObject(cJSON *item) { char *json_string = cJSON_Print(item); printf("%s\n", json_string); } Will this function leak memory? 回答1: I've never used cJSON , but as per the function definition present in this link, it looks like char *cJSON_Print(cJSON *item) {return print_value(item,0,1);} and static char *print_value(cJSON *item,int depth,int fmt); From print_value() function, the pointer returned is allocated by cJSON