json 组件
json 组件使 ESPHome 能够在自动化、传感器和 HTTP 请求中处理 JSON 数据。这对于以下场景特别有用:
- 处理 API 响应
- 向外部服务发送结构化数据
- 从 JSON 文件解析配置
什么是 JSON?
JSON 是一种文本语法,便于所有编程语言之间进行结构化数据交换。JSON 是由花括号、方括号、冒号和逗号组成的语法,在许多上下文、配置和应用中都很有用。 JSON 是 JavaScript Object Notation 的缩写,其灵感来自 JavaScript(即 ECMAScript)的对象字面量,如 ECMAScript 语言规范(第三版) 中所定义。
示例 1:相对复杂的 JSON
{ "first_name": "Chad", "last_name": "Matsalla", "is_alive": true, "age": 27, "address": { "street_address": "42 Nowhere Street", "city": "Fort Qu'Appelle", "state": "Saskatchewan", "postal_code": "S0G 1S0", "country": "Canada" }, "phone_numbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" } ], "children": [ "Austin", "Alex", "Juno", "Beethoven", ], "spouse": "Sarah"}示例 2:简单的 JSON:
{"key": 42.0, "greeting": "Hello World"}NOTE
要使用 json 组件,你需要在配置中包含它。请确保将 json: 放在根级别,与其他组件(如 esphome:)放在一起。
解析 JSON
Section titled “解析 JSON”本示例假设服务器返回如下形式的 JSON 对象响应:
{"status":"play","vol":"42","mute":"0"}
如果你想获取 vol 键的值并将其赋给一个 id 设为 player_volume 的模板 sensor 或 number 组件,
可以这样做,但请注意检查键是否存在可以避免难以阅读的错误消息:
on_...:- http_request.get: url: https://esphome.io capture_response: true on_response: then: - lambda: |- json::parse_json(body, [](JsonObject root) -> bool { if (root["vol"]) { id(player_volume).publish_state(root["vol"]); return true; } else { ESP_LOGD(TAG,"No 'vol' key in this json!"); return false; } });构建 JSON
Section titled “构建 JSON”你可以在 lambda 中使用嵌套数组来构建 JSON,如下所示:
on_...: - http_request.post: url: https://esphome.io json: |- root["key"] = id(my_sensor).state; root["greeting"] = "Hello World";这将发送:
{"key": 42.0, "greeting": "Hello World"}
反序列化时一个非常常见的错误是:
JSON parse error: InvalidInputESPHome 使用的软件并不会就出错原因给出特别有信息量的消息,但 ArduinoJson 团队创建了一个很棒的故障排查工具。
另一个重要资源是 JSONLint。它可以帮助你确定所使用的 JSON 是否有效。要与 ESPHome 的反序列化器一起使用,JSON 必须是有效的,而且如果你要发送 JSON,它对目标端来说可能也必须是有效的。