JSON 组件
json 组件使 ESPHome 能够在自动化、传感器和 HTTP 请求中处理 JSON 数据。这对于以下情况特别有用:
- 处理 API 响应
- 向外部服务发送结构化数据
- 从 JSON 文件解析配置
什么是 JSON?
JSON 是一种文本语法,便于在所有编程语言之间进行结构化数据交换。JSON 是一种由大括号、方括号、冒号和逗号组成的语法,在许多上下文、配置文件和应用程序中都很有用。 JSON 代表 JavaScript 对象表示法,其灵感来自 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,"此 JSON 中没有 'vol' 键!"); 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"}
故障排除错误
Section titled “故障排除错误”反序列化时一个非常常见的错误是:
JSON parse error: InvalidInputESPHome 使用的软件没有提供特别有意义的错误原因信息,但 ArduinoJson 的人们创建了一个很棒的故障排除工具。
另一个重要的资源是 JSONLint。它可以帮助您确定所使用的 JSON 是否有效。它必须有效才能与 ESPHome 的反序列化器一起工作,如果您要发送它,它可能也需要对目标有效。