我有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
}
现在我要问的是:我该如何从id为1490的地方提取温度和湿度。您将如何建议我经常进行检查?通过每10分钟运行一次cron作业,创建pilight-receive的输出,提取输出的数据并将其推送到Smart Home Control Api。
有人有一个主意-非常感谢
您可以用来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
jq已为大多数linux发行版预先打包。
可能有一种方法可以jq
自己完成,但是我发现在一行上同时获得两个想要的值的最简单方法是use xargs
。例如:
$ jq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json | xargs
25.1 40
或者,如果您想遍历每个.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
然后,您可以使用awk或其他方式对该输出进行后处理。
最后,python和perl都具有出色的库,用于解析和处理json数据。与其他几种语言一样,包括php和java。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句