ESP8266在Arduinojson获取网络数据时防止数据为空

ESP8266在使用Arduinojson获取网络数据时防止数据为空


在ESP8266网络访问中应该尽量避免访问处理接收数据为空。

对接收的关键数据,先判断,再创建变量接收。
  • 获取网络数据少不了的两个库
#include <HTTPClient.h>
#include <ArduinoJson.h>

  • 举例我们接收到的json数据
{"id":714,"uuid":"cc0f02de-cbba-4c45-9f60-6735d4d3435e","hitokoto":"一定要保护自己的梦想,即使牺牲一切。","type":"a","from":"NANA","from_who":"大崎娜娜","creator":"hitokoto","creator_uid":1775,"reviewer":0,"commit_from":"web","created_at":"1478787580","length":18}
  • 经过处理的数据
// String json;

StaticJsonDocument<512> doc;
DeserializationError error = deserializeJson(doc,json);//解析json,反序列化
//DynamicJsonDocument json(512); //分配内存,动态
if (error) {//检查API是否有返回错误信息
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
//关键信息获取
  // 复制我们需要的字符串 ,先检查是否为空,空会导致系统无限重启
  // isNull()检查是否为空 空返回1 非空0
 if (doc["hitokoto"].isNull() == 0)
const char* hitokoto = doc["hitokoto"]; // "一定要保护自己的梦想,即使牺牲一切。"
//strcpy(data->yiyan, doc["hitokoto"]);//复制字符串给调用的地方
 if (doc["from_who"].isNull() == 0)
const char* from_who = doc["from_who"]; // 
//strcpy(data->author, doc["from_who"]);//复制字符串给调用的地方
// 这不是强制复制,你可以使用指针,因为他们是指向"内容"缓冲区内,所以你需要确保
  // 当你读取字符串时它仍在内存中
StaticJsonDocument 和 DynamicJsonDocument

StaticJsonDocument是一个就地分配内存池的JsonDocument,因此它不依赖于动态内存分配。
因为它不调用malloc()和free(),所以StaticJsonDocument比DynamicJsonDocument稍微快一些。
如果声明一个StaticJsonDocument类型的局部变量,它将在堆栈内存中分配内存池。注意不要在堆栈中分配太大的内存池,因为这会导致堆栈溢出。对于小文档(小于1KB)使用StaticJsonDocument,如果它太大而无法放入堆栈内存,则切换到DynamicJsonDocument。

  • DynamicJsonDocument:动态内存

DynamicJsonDocument是一个在堆中分配内存池的JsonDocument。
因为它调用malloc()和free(),所以DynamicJsonDocument比StaticJsonDocument稍微慢一些。
DynamicJsonDocument允许存储比StaticJsonDocument大得多的文档,因为它不受堆栈大小的限制。

  • 1.heap是堆,stack是栈。2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。3.stack空间有限,heap的空间是很大的自由区。在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。4.举例:数据类型 变量名;这样定义的东西在栈区。如:Object a =null; 只在栈内存中分配空间new 数据类型();或者malloc(长度); 这样定义的东西就在堆区如:Object b =new Object(); 则在堆内存中分配空间.

** 使用StaticJsonDocument存储在堆栈中(对于小于1KB的文档推荐)
使用DynamicJsonDocument存储在堆中(对于大于1KB的文档推荐) **

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值