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。