JSON jdt 替换转换不起作用

问题描述 投票:0回答:1

我正在努力改变

{
  "outputs": [
    {
      "type": "Sample"
    },
    {
      "type": "Sample1",
      "indexNamePrefix": "Sample2",
      "serviceUri": "Sample3",
      "eventDocumentTypeName": "Sample4"
    }
  ]
}

变成这样的事情

{
  "outputs": [
    {
      "type": "Sample"
    },
    {
      "type": "Sample1",
      "indexNamePrefix": "Sample2",
      "serviceUri": "NewValue",
      "eventDocumentTypeName": "Sample4"
    }
  ]
}

我已经根据你的例子尝试了几种转换

尝试 1:我只是尝试替换 serviceUri,这是唯一的更改,以下是转换

{
  "outputs": {
    "@jdt.replace": {
      "@jdt.path": "@[?(@.serviceUri == Sample3)]",
      "@jdt.value": {
        "serviceUri": "NewValue"
      }
    }
  }
}

结果如下所示,与变换类似,但看起来并没有发生变换

{
  "outputs": {
    "@jdt.replace": {
      "@jdt.path": "@[?(@.serviceUri == Sample3)]",
      "@jdt.value": {
        "serviceUri": "NewValue"
      }
    }
  }
}

尝试2: 我尝试更换整个输出节点

{
  "outputs": {
    "@jdt.replace": [
      [
        {
          "type": "Sample"
        },
        {
          "type": "Sample1",
          "indexNamePrefix": "Sample2",
          "serviceUri": "NewValue",
          "eventDocumentTypeName": "Sample4"
        }
      ]
    ]
  }
}

结果也与这里的转换相同,我错过了什么吗?因为基本的删除和重命名转换工作正常。

这是我关注的链接https://github.com/Microsoft/json-document-transforms

提前致谢

json transformation devops
1个回答
0
投票

五年后,我仍然找不到这个基本问题的好答案。

我发现

@jdt.merge
@jdt.replace
@jdt.path
@jdt.value
命令似乎可以从文档的根开始工作,但我无法让它们从节点内解析,如示例所示你引用了。

这样的东西应该有效:

{
  "@jdt.replace": [
    {
      "@jdt.path": "$.outputs[?(@.type == 'Sample1')].serviceUri",
      "@jdt.value": "NewValue"
    }
  ]
}

$
表示文档的根。然后我们深入到
outputs
并使用
[?(...)]
进行搜索。 搜索参数中的
@
表示当前对象(即输出数组项),我们在其中搜索匹配的
type
属性并将其设置为“NewValue”。

您还可以使用此语法来更新节点上的多个属性:

{
  "@jdt.merge": [
    {
      "@jdt.path": "$.outputs[?(@.type == 'Sample1')]",
      "@jdt.value": {
        "serviceUri": "NewValue",
        "eventDocumentTypeName": "NewValue2"
      }
    }
  ]
}

@jdt.merge
表示仅更新提供的值。 如果您使用
@jdt.replace
,则该节点将仅包含这两个值。

© www.soinside.com 2019 - 2024. All rights reserved.