『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1474|回复: 7

[求助] ESPHome解析Json数据失败

[复制链接]

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
发表于 2023-10-20 09:42:12 | 显示全部楼层 |阅读模式
text_sensor:
    - platform: template
    name: "My Sensor Time"
    id: my_sensor_time
    update_interval: 1s
interval:
    - interval: 5s
    then:
    - http_request.get:
        url: "http://sensor.local/number/sensor_time"
        on_response:
            - lambda: |-
                ESP_LOGD("http_request", "data: %s", id(my_request).get_string());
               json::parse_json(id(my_request).get_string(), [](JsonObject root) {
               id(my_sensor_time).publish_state(root["value"]);
               });
通过http_request.get获取到了Json数据,
对Json解析的时候报错,内存不足,我的ESP32C3是4M的Flash

有什么办法解决吗?
微信图片_20231020094028.png
回复

使用道具 举报

2

主题

140

帖子

1819

积分

金牌会员

Rank: 6Rank: 6

积分
1819
金钱
1679
HASS币
0
发表于 2023-10-20 10:24:11 | 显示全部楼层
本帖最后由 adamjensen 于 2023-10-20 10:27 编辑

减少一些组件试试
回复

使用道具 举报

3

主题

321

帖子

2929

积分

论坛积极会员

积分
2929
金钱
2608
HASS币
10
发表于 2023-10-20 10:47:53 | 显示全部楼层
嘿嘿,这就是我之前说的,为啥esphome互通我用了mqtt的原因之一。
回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2023-10-20 10:51:02 | 显示全部楼层
adamjensen 发表于 2023-10-20 10:24
减少一些组件试试

就这两个组件和一些wifi相关的配置,
使用esp8266就正常(也是4Mflash),但是这个ESP32C3就报错了
回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2023-10-20 10:52:21 | 显示全部楼层
tcwj2008 发表于 2023-10-20 10:47
嘿嘿,这就是我之前说的,为啥esphome互通我用了mqtt的原因之一。

老哥,mqtt有教程不?学习一下
回复

使用道具 举报

55

主题

308

帖子

5137

积分

元老级技术达人

积分
5137
金钱
4819
HASS币
80
发表于 2023-10-20 13:51:58 | 显示全部楼层
这不是内存不足,堆上还剩一百多k呢怎么可能不足。翻翻源码大概就知道原因了。
回复

使用道具 举报

55

主题

308

帖子

5137

积分

元老级技术达人

积分
5137
金钱
4819
HASS币
80
发表于 2023-10-20 14:09:20 | 显示全部楼层
从日志上看解析json的时候申请内存大小为0,导致代码误判为申请内存失败,实际上你试图解析的字符串是空的。你翻一下源码,esp8266和esp32中关于getString的实现是不一样的,esp8266会缓存getString的结果,但esp32会直接从http流下载内容,第二次再getString的时候就没有字符可以返回了。所以不能想当然就多次调用id(my_request).get_string()啊。实际上对于esp32,你直接去掉这行应该可以
ESP_LOGD("http_request", "data: %s", id(my_request).get_string());

回复

使用道具 举报

9

主题

53

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
金钱
227
HASS币
0
 楼主| 发表于 2023-10-20 14:30:29 | 显示全部楼层
ryanh7 发表于 2023-10-20 14:09
从日志上看解析json的时候申请内存大小为0,导致代码误判为申请内存失败,实际上你试图解析的字符串是空的 ...

非常感谢,按照你的提醒来做就好了
先使用json_string 来缓存数据,再慢慢解析,现在成功了
interval:
  - interval: 5s
    then:
      - http_request.get:
          url: "http://sensor.local/number/sensor_time"
          on_response:
            - lambda: |-
                std::string json_string = id(my_request).get_string();

                // 打印 JSON 字符串
                ESP_LOGI("Rx", "%s", json_string.c_str());

                // 尝试解析 JSON
                json::parse_json(json_string.c_str(), [](JsonObject root) {
                  id(my_sensor_time).publish_state(root["state"].as<std::string>());
                });
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-26 22:01 , Processed in 0.374294 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表