龙空技术网

ESP32/ESP8266中如何使用JSON

程序猿老欧 232

前言:

如今各位老铁们对“jsonjs取值”大约比较讲究,小伙伴们都想要了解一些“jsonjs取值”的相关知识。那么小编同时在网上收集了一些关于“jsonjs取值””的相关知识,希望朋友们能喜欢,同学们一起来学习一下吧!

ESP32/ESP8266中如何使用JSON

JSON是什么

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

我们拿来做什么

因为我们整个物联网系统,包括硬件设备,单片机,微型电脑,手机,服务器,数据库等,要使它们之间能相互通信,如果只是用字符串来表示的话,那肯定得相当混乱,无法管理,无法维护。

所以我们必须找到一种通用的数据编码格式来使这些设备能通信起来,并且维护还很方便,JSON无疑是最好的选择,虽然现在有很多人说JSON解析慢,存在太多无用的数据,数据结构大等等缺点,但JSON无疑是应用最广泛的。这对于我们后期的开发和维护都将提高很大的效率。

ArduinoJson介绍

ArduinoJson是一个纯由C++编写的Json库,支持大部分常用的Json数据操作;

ArduinoJson比较小巧(目前v6.9.1版本文件约160K左右大小),只有一个.h文件,使用时只需引用它即可;

虽然小巧但官方页面一点不含糊,排版合理,资料详细,还提供了一个非常方便的工具;

虽然名字里有Arduino但并非只能用在Arduino里,可以用于所有支持C++的地方;

ArduinoJson基于MIT开源协议,也就是说它是可以免费的;

官方主页:

GitHub项目地址:

Arduino IDE中安装

首先打开Arduino IDE,然后依次项目-》加载库-》管理库

使用方法

首先导入头文件

#include <ArduinoJson.h>

反序列化(解析数据)

引用ArduinoJson库;

声明JsonDocument对象;

尝试反序列化json字符串到JsonDocument对象;

根据需求取用数据;

StaticJsonDocument<200> doc; //声明一个JsonDocument对象

DeserializationError error = deserializeJson(doc, payloadStr); //反序列化JSON数据

if(!error) {

String action = doc["action"];

if (action.equals("hello") == true) {

}

}

序列化(创建数据)

引用ArduinoJson库;

声明JsonDocument对象;

向JsonDocument对象中添加数据;

序列化处理JsonDocument对象使成为json字符串;

StaticJsonDocument<200> actiondoc;

actiondoc["action"] = "on light";

char actiondocDoc[measureJson(actiondoc) + 1];

serializeJson(actiondoc, actiondocDoc, measureJson(actiondoc) + 1);

API简单介绍

对象

JsonDocument

使用StaticJsonDocument<size> doc;或DynamicJsonDocument doc(size);方式声明JsonDocument对象;

使用StaticJsonDocument<size> doc;方式声明的对象将存储在栈内存中,推荐size不大于1K时使用该方式;

使用DynamicJsonDocument doc(size);方式声明的对象将存储在堆内存中,推荐size大于1K时使用该方式;

size大小可以根据JsonDocument对象含有的节点数与值和数据长度计算得出,最保险的话可以根据json字符串(压缩形式)的长度len取值,size = len (8bit)、size = len*2 (32bit)、size = len*4 (64bit);

JsonDocument对象可以是JsonArray、JsonObject、JsonVariant三类引用类型;

JsonDocument对象的部分方法如下:

as<T>()

显式转换数据类型,如果类型不符合则根据类型返回0或空值;

This function returns a default value if the cast is not possible. The default value is:

0 for numerical types

NULL for const char*

A null reference for JsonArray and JsonObject.

is<T>()

判断是否为为某类型;

add()

向数组添加数据,添加成功返回true,失败返回false;

clear()

清除并释放内存;

createNestedArray()

创建数组,括号中可以输入数组的键名称,创建成功则返回数组指针,失败则返回空值;

createNestedObject()

创建对象,括号中可以输入对象的键名称,创建成功则返回对象指针,失败则返回空值;

operator[]

返回值定的值,如果该键不存在则根据类型返回0或空值;

isNull()

返回是否为空,空返回true,非空返回false;

to<T>()

清空并转换为指定类型;

JsonVariant

JsonVariant是JsonDocument的引用类型,可以表示任何json支持的数据类型,拥有的方法大部分和JsonDocument相同,下面是部分新增的方法:

set()

设置对象的值,设置成功返回ture,失败返回false;

重载了运算符==、!=、<、<=、>、>=;

JsonObject

JsonObject使用基本同JsonVariant,部分方法如下:

containsKey()

测试对象中是否存在某个键,输入参数为键名称,如果存在返回true,不存在返回false;

remove()

移除某个键值对,输入参数为键名称,如果该键值对不存在则不进行操作;

size()

返回对象所包含键值对数量;

没有add()方法;

JsonArray

JsonArray使用基本同JsonObject,部分不同如下;

没有containsKey()方法;

有add()方法;

序列化与反序列化

deserializeJson()

该方法可以反序列化数据(将字符串解析为json);

输入参数分别为JsonDocument对象、原始字符串、字符串长度(可选),嵌套深度(可选);

返回DeserializationError类型错误,取值分别为:

Ok序列化成功;

IncompleteInput输入不完整;

InvalidInput输入无效;

NoMemoryJsonDocument对象空间不足;

NotSupported出现不支持的数据类型;

TooDeep嵌套层数太深;

serializeJson()

该方法可以序列化数据(将JsonDocument对象转换为字符串,压缩形式);

输入参数分别为JsonDocument对象、目标字符串(或者print到某接口)、字符串长度(可选);

返回写入字节数;

serializeJsonPretty()

该方法可以序列化数据(将JsonDocument对象转换为字符串,展开形式,其他同上);

measureJson()

计算serializeJson()生成文档大小,不包含停止符;

measureJsonPretty()

计算serializeJsonPretty()生成文档大小,不包含停止符;

其它

json最大嵌套层数

ArduinoJson库中定义了ARDUINOJSON_DEFAULT_NESTING_LIMIT,该参数表示json最大嵌套层数,可以在库文件中更改该值以改变全局最大嵌套层数;

也可以使用下面方法临时改变最大嵌套层数:

deserializeJson(doc, input, DeserializationOption::NestingLimit(20));

ArduinoJson库版本

ArduinoJson库中定义了版本信息,相关定义如下:

#define ARDUINOJSON_VERSION "6.9.1"

#define ARDUINOJSON_VERSION_MAJOR 6

#define ARDUINOJSON_VERSION_MINOR 9

#define ARDUINOJSON_VERSION_REVISION 1

使用ArduinoJson助手生成代码

ArduinoJson使用太麻烦?JsonDocument该取多大不清楚?没关系使用ArduinoJson Assistant完美解决上述问题,自动生成代码,复制即可使用:

其他说明

ArduinoJson v6.7开始JsonDocument必须指定大小,如果想要使用动态长度的话请自行参考使用v6.7以前版本;

字符串使用char[]形式很多时候可以提供更好的性能,因为JsonDocument在处理该类型时只引用它,而在使用其他类型时会将内容拷贝至JsonDocument;

标签: #jsonjs取值