代码之家  ›  专栏  ›  技术社区  ›  Ryan Bolger

处理带有jq和引号的json数组

  •  2
  • Ryan Bolger  · 技术社区  · 9 年前

    我正在尝试编写一个脚本,对json对象数组进行一些处理。源json的简化版本如下所示。注意第二个对象中的转义双引号。

    [
      {
        "id": "1a-2b",
        "name": "my job name",
        "description": "my job description"
      },
      {
        "id": "3c-4d",
        "name": "my \"quoted\" job name",
        "description": "my \"quoted\" job description"
      }
    ]
    

    我的脚本目前试图使用我在搜索的其他地方找到的“while read”习语来遍历源代码,该习语看起来像这样。

    while read job; do
    
      # fetch individual values into variables
      jobname=`echo $job | jq -r '.name'`
    
      # do processing on the individual values
      echo $jobname
    
    done < <(cat jobs | jq -c '.[]')
    

    问题似乎是,转义的引号在紧凑的输出和随后的$job变量中没有转义。因此,当我在循环中使用jq重新处理单个对象时,我会在每个引用了值的对象上得到一个jq解析错误。

    我目前正在使用jq 1.4,我一直在尝试tojson/fromjson/@sh/tostring的各种组合,但尚未找到正确的组合。如果jq 1.5有一个功能可以让它变得更容易,我并不反对它。如果有一种更聪明的方法来做我想做的事情,我也不喜欢“边读边读”这个成语。

    2 回复  |  直到 9 年前
        1
  •  5
  •   chepner    9 年前

    而不是打电话 jq 同样,在每个数组元素上,只需使用第一个调用获取名称,该调用将为循环提供数据。

     while read -r job; do
         echo "$job"
     done < <(jq -c '.[].name' < jobs)
    

    (和使用 read -r 如Etan所建议的)。


    如果需要多个变量,请尝试(例如)

    while read -r id
          read -r job; do
        echo "$id: $job"
    done < <(jq -c '.[]|.id,.name' < jobs)
    
        2
  •  1
  •   Shaffiulla Khan    9 年前

    这可以在一行中完成

    要查看,json文件内容(文件名为jobs):
    [ { "id": "1a-2b", "name": "my job name", "description": "my job description" }, { "id": "3c-4d", "name": "my \"quoted\" job name", "description": "my \"quoted\" job description" } ]

    jq单线 jq '.[] | (.name)' jobs

    输出:

    "my job name" "my \"quoted\" job name"