json jslt访问for表达式中的父字段

f3temu5u  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(112)

Hi,我想用jslt转换json,但遇到了无法解决的问题

  1. 1.输入json数据如下
{
    "user_id": "001",
    "friends": [{
        "friend_id": "002"
    }, {
        "friend_id": "003"
    }, {
        "friend_id": "004"
    }]
}
  1. 1.然后,输出我期望的json数据如下:
[{
    "user_id": "001",
    "friend_id": "002"
}, {
    "user_id": "001",
    "friend_id": "003"
}, {
    "user_id": "001",
    "friend_id": "004"
}]
  1. 1.在jslt表达式中,我使用for的表达式来遍历数组字段friends:
[
    for (.friends) {
        "user_id": .user_id,
        "friend_id": .friend_id
    }
]
  1. 1.但是,treansform结果无法获取字段user_id
[{
    "friend_id": "002"
}, {
    "friend_id": "003"
}, {
    "friend_id": "004"
}]

如何访问数组字段友元作用域之外的字段user_id?期待您的帮助,谢谢!

7eumitmz

7eumitmz1#

另一个答案是正确的,但比它需要的更复杂。这就足够了:

let user_id = (.user_id)
[ for (.friends) { "user_id": $user_id , "friend_id" : .friend_id } ]

请注意,如果你真的想报告错误,你可以这样做:

if (.user_id and .friends)
  let user_id = (.user_id)
  [ for (.friends) { "user_id": $user_id , "friend_id" : .friend_id } ]
else if (not(.user_id))
  error("user_id field missing")
else
  error("friends field missing")

使用error可以在Java级别上将其转换为异常。
不支持父操作符的原因是Jackson在其节点中没有父指针。这是一个性能特性,因为这意味着节点可以在多个地方重用,从而节省CPU和内存。

57hvy0tb

57hvy0tb2#

您需要为user_id使用一个变量,然后可以在循环中引用该变量。
以下应符合您的要求:

if (.user_id)
  let user = .user_id
  if (.friends)
    [
      for (.friends) {
        "user_id": $user,
        "friend_id": .friend_id
      }
    ]
  else
    error("missing key 'friends'")
else
  error("missing key 'user_id'")

相关问题