JSONファイルからデータを抽出する方法

JSONファイルからデータを抽出する方法

私は私の問題の解決策を探していましたが、解決策が見つからなかったか、より良い表現では私が見つけた解決策を得ませんでした。私の質問は:私は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出力データを抽出してスマートホーム制御APIにプッシュしますか?

ベストアンサー1

jqシェルを使用してjsonファイルを処理できます。

たとえば、サンプルのjsonファイルを次のように保存してから、raul.json次のように実行しました。

$ jq .message.temperature raul.json 
409.5
25.1
409.5
$ jq .message.humidity raul.json 
null
40
null

ジャックほとんどのLinuxディストリビューションでは事前にパッケージ化できます。

それ自体でこれを行う方法があるかもしれませんが、jq1行に2つの望ましい値を取得する最も簡単な方法は次のようにすることですxargs

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

.message.idまたは、各インスタンスを繰り返す場合は、.message.id出力に追加して使用できます。xargs -n 33つのフィールド(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を含む他の多くの言語と同様に。

おすすめ記事