jqを使用してjsonファイルから値を取得する

jqを使用してjsonファイルから値を取得する

「game」、「toy」、「book」の後に値を印刷する方法は?以下は、ファイルのjq '.'の出力です。

 {
    "reports": [
        {
          "games": 3,
          "toys": 0,
          "books": 3,
          "to": "2017-07-22T00:00:00.000+0000",
          "from": "2017-07-21T00:00:00.000+0000",
          "eventType": "bookedIn",
          "rowName": "CWQ"
        },
        {
          "games": 0,
          "toys": 0,
          "books": 0,
          "to": "2017-07-22T00:00:00.000+0000",
          "from": "2017-07-21T00:00:00.000+0000",
          "eventType": "bookedOut",
          "rowName": "AED"
        }
    ]
 }

私は前に試しました

{echo"[";猫ファイル; echo "]"} | jq -r '.[] | ( "\n" + .rowName + ":", "ゲーム-> " + (.games | tostring ) "おもちゃ-> " + (.toys | tostring), "本-> " + (.books | tostring) )) '

私は何かが間違っているようです。

修正する 私が知っている限り、本にプロバイダと名前という2つの異なる項目があるとしましょう。 - ?

jq -r '.reports |
.[] |
("\n" + .rowName + ":",
 "Games: " + (.games | tostring),
 "Toys: " + (.toys | tostring),
 .books | .[] |
 ("\n" + .name + ": ",
 "provider: " + (.provider | tostring) ) ) 
' response.json

jq: エラー (response.json:1): Cannot iterate over null(null) が発生します。

ベストアンサー1

JSONコマンドラインパーサーを使用してくださいjq

$ jq -r '.reports[] |          
         "\(.rowName) :",     
         "books -> \(.books)",
         "toys -> \(.toys)",  
         "games -> \(.games)\n"' input.json

CWQ:
books -> 3
toys -> 0
games -> 3

AED:
books -> 0
toys -> 0
games -> 0

注:これはjq文字列補間を使用し、配列内のすべての項目を繰り返してreports関連情報を選択します。


.books更新:オブジェクト配列の操作:

与えられた

{
  "reports": [
    {
      "games": 3,
      "toys": 0,
      "books": [
        {
          "provider": "The provider",
          "name": "The name"
        }
      ],
      "to": "2017-07-22T00:00:00.000+0000",
      "from": "2017-07-21T00:00:00.000+0000",
      "eventType": "bookedIn",
      "rowName": "CWQ"
    },
    {
      "games": 0,
      "toys": 0,
      "books": [
        {
          "provider": "The 1st provider",
          "name": "The 1st name"
        },
        {
          "provider": "The 2nd provider",
          "name": "The 2nd name"
        }
      ],
      "to": "2017-07-22T00:00:00.000+0000",
      "from": "2017-07-21T00:00:00.000+0000",
      "eventType": "bookedOut",
      "rowName": "AED"
    }
  ]
}

私たちは簡単に行うことができます

$ jq -r '.reports[] |
         "\(.rowName):",
         ( .books[] | "book name -> \(.name)",
                      "book provider -> \(.provider)" ),
         "toys -> \(.toys)",
         "games -> \(.games)\n"'

CWQ:
book name -> The name
book provider -> The provider
toys -> 0
games -> 3

AED:
book name -> The 1st name
book provider -> The 1st provider
book name -> The 2nd name
book provider -> The 2nd provider
toys -> 0
games -> 0

おすすめ記事