跳转到内容

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 对象响应: {"status":"play","vol":"42","mute":"0"}

如果您想检索 vol 键的值并将其分配给 id 设置为 player_volume 的模板 sensornumber 组件,可以这样做,但请注意,检查键是否存在可以防止难以阅读的错误消息:

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;
}
});

您可以使用嵌套数组在 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 的反序列化器一起工作,如果您要发送它,它可能也需要对目标有效。