使用jolt转换从JSON中提取值

3

我有一个 JSON 对象:

{
  "Data": "{field1: [x,y],field2: z}"
}

所需输出的JSON:
{
  "field3": "z"
}

[
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "*field2:*}*": {
          "$(0,2)": "field3"
        }
      }
    }
  }
]

在这里,"Data"的值是一个完整的字符串,而不是一个JSON,因此我必须将其拆分为通配符,现在规范中第二个'*'给了我值"z"
是否有更好的方法来完成同样的工作,以便如果field2之前或之后出现新字段,则不必修改此正则表达式。
2个回答

0

实际情况非常好,你已经很接近了,只需要对当前键进行两个修改("*field2:*}*")即可:

  • 删除末尾的星号。因为它期望至少有一个字符跟在 } 后面,但在当前情况下失败了
  • 在第二个星号前保留一个空格,以修剪结果字符串 "z" 而不是 " z"

因此,请将 "*field2:*}*" 转换为 "*field2: *}"

[
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "*field2: *}": {
          "$(0,2)": "field3"
        }
      }
    }
  }
]

或者您可以按照以下方式重塑键,并使用文字fiel,从而获得相同的结果。

[
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "*],*d2: *}": {
          "$(0,3)": "&(1,2)d3"
        }
      }
    }
  }
]

0

首先,这似乎不是JOLT中需要解决的问题,相反,应该将Data提取并序列化为JSON。

话虽如此,我已经成功地让一些东西工作了,在下面进行解释:

[
  //Remove {
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "{*": {
          "$(0,1)": "Data"
        }
      }
    }
  },
  //Remove }
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "*}": {
          "$(0,1)": "Data"
        }
      }
    }
  },
  // Split by ,
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "Data": "=split(',', @(2,Data))"
    }
  },
  // Trim
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "Data": {
        "*": "=trim"
      }
    }
  },
  // Select field2
  {
    "operation": "shift",
    "spec": {
      "Data": {
        "*": {
          "field2:*": {
            "$(0,1)": "field3"
          }
        }
      }
    }
  },
  // Trim again
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=trim"
    }
  }
]


测试目标:

{
  "Data": "{field1: [x,y], field2: z}"
}

并且

{
  "Data": "{ field2: z, field1: [x,y]}"
}

并且

{
  "Data": "{field1: [x,y], field2: z, field3: [x,y]}"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接