jq を使った JSON データ処理

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux jqプログラミング実験にようこそ!この実験では、軽量で多用途なコマンドラインJSONプロセッサであるjqをどのように使用するかを学びます。jqsedのようなものと考えてくださいが、JSONデータに特化しています。これにより、構造化データを簡単にスライス、フィルタリング、マッピング、変換することができます。この実験では、APIや設定ファイルからのJSONデータを処理するなど、現実世界のシナリオで適用できる実際の例を通じて、基本的なjqの使用から高度な使用までをガイドします。

中国への旅行を計画しており、各地の観光名所の場所、営業時間、レビューなどの詳細を提供する旅行アプリを使用していると想像してみてください。アプリのバックエンドはこのデータをJSON形式で保存しています。あなたのタスクは、効果的に旅行を計画するために特定の情報を抽出することです。この実験では、jqを使用してこのJSONデータを照会および操作する方法を示し、訪れるのに最適な観光名所を迅速に特定する方法を紹介します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/InputandOutputRedirectionGroup(["Input and Output Redirection"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/InputandOutputRedirectionGroup -.-> linux/pipeline("Data Piping") subgraph Lab Skills linux/cat -.-> lab-279945{{"jq を使った JSON データ処理"}} linux/pipeline -.-> lab-279945{{"jq を使った JSON データ処理"}} end

基本的なJSON照会

JSONオブジェクトから簡単なデータを抽出する方法を学びましょう。

あなたの/home/labex/project/ディレクトリには、今やdata.txtファイルがあるはずです。そこには、観光名所のリストを表すJSONデータが含まれています。ファイルの内容はこのようになっています。

[
  {
    "name": "万里の長城",
    "location": "山西省",
    "opening_hours": "24時間"
  },
  {
    "name": "兵馬俑",
    "location": "西安",
    "opening_hours": "午前9時 - 午後5時"
  }
]

ここでの目標は、このJSONデータにリストされているすべての観光名所の名前を抽出することです。

これを達成するには、次のコマンドを使用します。

cat ~/project/data.txt | jq '.[] |.name'

このコマンドは、次の出力を生成します。

"万里の長城"
"兵馬俑"

このコマンドで何が起こっているのか解説しましょう。cat ~/project/data.txtは、単にdata.txtファイルの内容を読み取ります。|記号はパイプと呼ばれ、catコマンドの出力を取り、それをjqコマンドの入力として供給します。抽出ロジックの核心はjq '.[] |.name'にあります。jqがこれをどのように処理するかを以下に示します。

  • .[]は、jqに対してJSON配列内の各要素(この場合は、各観光名所オブジェクト)を反復処理するように指示します。
  • 再び|は、反復処理の結果を次の操作、この場合は.nameにパイプで送ります。
  • .nameは、各観光名所オブジェクトから"name"キーに関連付けられた値を抽出します。

本質的に、このコマンドは各観光名所を順に処理し、その名前を選択して表示します。

JSONデータのフィルタリング

次に、特定の基準に基づいてJSONデータをフィルタリングする方法を学びましょう。

私たちの目的は、24時間営業している観光名所のみを見つけることです。

これを達成するには、次のコマンドを使用します。

cat ~/project/data.txt | jq '.[] | select(.opening_hours == "24 hours") |.name'

このコマンドを実行すると、次のような出力が表示されます。

"万里の長城"

このフィルタリングの仕組みは次の通りです。コマンドはcat ~/project/data.txt | jq '.[]'から始まり、前と同じようにファイルを読み取り、各観光名所を反復処理します。重要な部分はselect(.opening_hours == "24 hours")の追加です。

  • select()は、指定した条件に基づいてJSONの要素をフィルタリングするためのjq関数です。
  • 条件.opening_hours == "24 hours"は、opening_hoursフィールドの値が文字列"24 hours"と正確に一致するかどうかをチェックします。この条件に一致する観光名所のみが次の段階に渡されます。
  • 最後の部分|.nameは、フィルタを通過した各観光名所の名前を単に抽出します。

この場合、「万里の長城」のみが条件に合致するため、抽出されて表示されるのはこの名前のみです。

JSONデータの変換

次に、JSONデータを別の、より便利な形式に変換する方法を見てみましょう。

ここでの目標は、営業時間をもっと読みやすくすることです。具体的には、ある観光名所が24時間営業している場合、「24時間営業」と表示します。そうでない場合、既存の営業時間のテキストに「営業中 」の接頭辞を追加します。

これを達成するには、次のコマンドを使用します。

cat ~/project/data.txt | jq '.[] | {name:.name, location:.location, opening_hours: (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)" end)}'

このコマンドは、次のような出力を生成します。

{
  "name": "万里の長城",
  "location": "山西省",
  "opening_hours": "営業中 24時間"
}
{
  "name": "兵馬俑",
  "location": "西安",
  "opening_hours": "営業中 午前9時 - 午後5時"
}

変換方法を理解しましょう。前と同じように、cat ~/project/data.txt | jq '.[]'がファイルを読み取り、配列内の各観光名所を反復処理することで始まります。この変換の核心は、オブジェクトの構築とif-else文にあります。

  • {name:.name, location:.location, opening_hours:...}は、元のオブジェクトからデータを抽出して新しいJSONオブジェクトを作成します。元のオブジェクトのnamelocationをそのまま含めます。ただし、opening_hoursフィールドの値はもっと複雑です。
  • (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)" end)は、元のopening_hoursの値を取得して処理します。
    • .opening_hoursは元の営業時間の値を選択します。
    • if. == "24 hours" then "Open 24 hours" else "Open \(.)" end文は、元のopening_hoursが正確に「24時間」と等しいかどうかをチェックします。等しい場合、値は「営業中 24時間」に置き換えられます。等しくない場合、「営業中 」が既存のopening_hoursの接頭辞として追加されます。\(.)の使用に注意してください。これにより、値を文字列の中に埋め込むことができます。

本質的に、このコマンドは各観光名所に対して新しいオブジェクトを作成し、opening_hoursの値をユーザーにとってより読みやすく調整することでデータを変換します。

まとめ

おめでとうございます!あなたはLinux jqプログラミング実験を成功裏に完了しました。コマンドラインから直接構造化データを操作するための強力なツールであるjqを使用して、JSONデータを照会、フィルタリング、変換する方法を学びました。API、設定ファイル、または他の任意のJSONソースからのデータを処理している場合でも、jqを使えば必要なデータを効率的かつ明確に抽出、フィルタリング、操作することができます。

覚えておいてください。jqやその他のコマンドラインツールをマスターするには、一貫した練習が欠かせません。自分自身のJSONデータを使って、さまざまな照会と変換を試してみるのも構いません。楽しいコーディングを!