如何从 JSON 文件中提取数据

Rau*_*hez 18 text-processing json

我有 bin 为我的问题搜索解决方案,但没有找到一个或更好的说法我没有得到我发现的东西。所以让我们谈谈我的问题是什么。我在 Raspberry Pi 上使用智能家居控制软件,本周末我发现使用 pilight-receive 可以从室外温度传感器获取数据。pilight-receive 的输出如下所示:

{
        "message": {
                "id": 4095,
                "temperature": 409.5
        },
        "origin": "receiver",
        "protocol": "alecto_wsd17",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 3
}
{
        "message": {
                "id": 1490,
                "temperature": 25.1,
                "humidity": 40.0,
                "battery": 1
        },
        "origin": "receiver",
        "protocol": "alecto_ws1700",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 3
}
{
        "message": {
                "id": 2039,
                "temperature": 409.5
        },
        "origin": "receiver",
        "protocol": "alecto_wsd17",
        "uuid": "0000-b8-27-eb-0f3db7",
        "repeats": 4
}
Run Code Online (Sandbox Code Playgroud)

现在我要问你:我怎么能从 id 为 1490 的地方提取温度和湿度。你会如何建议我经常检查这个?通过每 10 分钟运行一次的 cron 作业,创建 pilight-receive 的输出,提取输出的数据并将其推送到智能家居控制 Api。

有人有想法 - 非常感谢

cas*_*cas 30

您可以使用jq在 shell 中处理 json 文件。

例如,我将您的示例 json 文件另存为raul.json,然后运行:

$ jq .message.temperature raul.json 
409.5
25.1
409.5
$ jq .message.humidity raul.json 
null
40
null
Run Code Online (Sandbox Code Playgroud)

jq可用于大多数 linux 发行版的预打包。

可能有一种方法可以做到这一点jq,但我发现在一行上获得两个想要的值的最简单方法是使用xargs. 例如:

$ jq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json | xargs
25.1 40
Run Code Online (Sandbox Code Playgroud)

或者,如果您想遍历每个.message.id实例,我们可以添加.message.id到输出并使用xargs -n 3我们知道将有三个字段(id、温度、湿度):

jq '.message.id, .message.temperature, .message.humidity' raul.json | xargs -n 3
4095 409.5 null
1490 25.1 40
2039 409.5 null
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 awk 或其他任何方式对该输出进行后处理。


最后,python 和 perl 都具有用于解析和操作 json 数据的优秀库。与其他几种语言一样,包括 php 和 java。

  • 具体来说,`jq'select(.message.id == 1490) | .message.温度,.message.湿度' raul.json` (2认同)
  • json 不能像 xml 或 html 一样用正则表达式可靠地解析。并且大多数 json 数据(例如通过 web api 获取)并没有很好地格式化,带有额外的换行符和缩进。要可靠地解析 json,您需要一个 json 解析器。`jq` 就是 shell 脚本中的一种。其他语言有 json 解析库。 (2认同)