如何从 JSON 中读取嵌套数组元素?

How to read nested array elements from JSON?

我需要用嵌套数组元素解析 JSON 并提取值。

我不确定如何使用嵌套数组来设置输出中的属性值 JSON。

这是输入:

  [{
        "name": "book1",
        "id": 18789,
        "locations": [{
            "state": "mystate",
            "phone": 8877887700
        }, {
            "state": "mystate1",
            "phone": 8877887701
        }]
    },
    {
        "name": "book2",
        "id": 18781,
        "locations": [{
            "state": "mystate3",
            "phone": 8877887711
        }, {
            "state": "mystate4",
            "phone": 8877887702
        }]
    }]

这是预期的输出:

{
    "name": ["book1", "book2"],
    "id": ["18789", "18781"],
    "states": [
        ["mystate", "mystate"],
        ["mystate3", "mystate4"]
    ]
}

我正在尝试使用以下 JSLT 表达式:

{
  "name" : [for (.)
               let s = string(.name)
               $s],
"id": [for (.)
               let s = string(.id)
               $s],
"states": [for (.)
               let s = string(.locations)
               $s]
}  

但我不确定在这种情况下如何设置 states 以便我在输出中具有状态值。

使用 JQ 或 JSONPath 的解决方案也可能有帮助。

使用 JQ 会比这更容易。

{
  name:   map(.name),
  id:     map(.id),
  states: map(.locations | map(.state))
}

Online demo

在 JSLT 中你可以这样实现它:

{
  "name" : [for (.) .name],
  "id": [for (.) .id],
  "states": flatten([for (.) [for (.locations) .state]])
} 

如您所见,states 键实现起来有点笨拙。我想过让路径表达式遍历数组成为可能,如果我们将其添加到语言中,它可以像这样实现:

{
  "name" : .[].name,
  "id": .[].id,
  "states": .[].locations.[].state
}