跳转到内容

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 对象响应: {"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;
}
});

你可以在 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: InvalidInput

ESPHome 使用的软件并不会就出错原因给出特别有信息量的消息,但 ArduinoJson 团队创建了一个很棒的故障排查工具。

另一个重要资源是 JSONLint。它可以帮助你确定所使用的 JSON 是否有效。要与 ESPHome 的反序列化器一起使用,JSON 必须是有效的,而且如果你要发送 JSON,它对目标端来说可能也必须是有效的。