【问题标题】:Using jq, how can I get nested values from within nested arrays from JSON data accurately?使用 jq,如何从 JSON 数据的嵌套数组中准确获取嵌套值?
【发布时间】:2020-01-24 21:14:18
【问题描述】:

我有一个如下所示的 JSON 文件:

{
    "people": {
        "names": [{
                "last_name": "Smith",
                "first_names": [{
                        "name": "Bill"
                    },
                    {
                        "name": "Alice"
                    },
                    {
                        "name": "Mary"
                    }
                ]
            },
            {
                "last_name": "Brown",
                "first_names": [{
                        "name": "Gil"
                    },
                    {
                        "name": "Bob"
                    },
                    {
                        "name": "Mary"
                    }
                ]
            },
            {
                "last_name": "Sanchez",
                "first_names": [{
                        "name": "Gil"
                    },
                    {
                        "name": "Jose"
                    },
                    {
                        "name": "Marlena"
                    }
                ]
            }
        ]
    }
}

我正在寻找的输出是:

Smith, Bill
Smith, Alice
Smith, Mary
Brown, Gil
Brown, Bob
Brown, Mary
Sanchez, Gil
Sanchez, Jose
Sanchez, Marlena

我创建了一个如下所示的 jq 查询:

jq -r '.people | "\(.names[].last_name), \(.names[].first_names[].name)"' nameFile.json | sort

但我得到的输出是:

Brown, Alice
Brown, Bill
Brown, Bob
Brown, Gil
Brown, Gil
Brown, Jose
Brown, Marlena
Brown, Mary
Brown, Mary
Sanchez, Alice
Sanchez, Bill
Sanchez, Bob
Sanchez, Gil
Sanchez, Gil
Sanchez, Jose
Sanchez, Marlena
Sanchez, Mary
Sanchez, Mary
Smith, Alice
Smith, Bill
Smith, Bob
Smith, Gil
Smith, Gil
Smith, Jose
Smith, Marlena
Smith, Mary
Smith, Mary

显然这是不正确的,我可以看出原因:第二个表达式忠实地遍历了 names 数组中的每个匹配项。但我不知道如何解决这个问题。

【问题讨论】:

  • 供您考虑,这里还有一个 alternative(即非 jq)解决方案,用于您问题中的 JSON 操作,基于 unix walk-path i> 实用程序 jtc:<file.json jtc -w'[last_name]:<L>P:[-1]<name>l:' -T'"{L}, {}"' -qq。如果您有兴趣,请告诉我 - 我可以在单独的答案中详细说明工具的使用。 (PS。我是该工具的开发者)
  • 我与jq -r '.people | .names[] | "\(.last_name, .first_name[].name)' nameFile.json 的距离更近了一步。打印姓氏,后跟相关的名字。

标签: json jq


【解决方案1】:

要获得您想要的结果,您必须在迭代 .first_names 的循环之外迭代 .names

.people
| .names[]
| "\(.last_name), \(.first_names[].name)"

【讨论】:

  • 我正朝着那个方向前进,但感谢@peak 为我加快了速度:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多