从值中包含逗号的 JSON 中提取键值对

Extract Key Value Pair from JSON having commas in the value

我正在尝试解析 JSON,我希望将键值对作为输出。我使用 tNormalize 以逗号分隔,然后使用 tExtractRegex 转换为键值对。这一直很好,直到有一天我在 JSON 值中得到一个逗号。然而,这个逗号在引号之间,因此 JSON 是有效的,但由于 tNormalize 组件在逗号上拆分,它也将这些逗号用于拆分。

例如。 我的样本 JSON:

{
"PQR":"XYZ",
"data":[
{
"Name":"John","Address":"someCity"
},
{
"Name":"Mary","Address":"someCity,somecountry","Age":39
}
]
}

预期的输出将是一个键值对:

Key|Value
Name|John
Address|someCity
Name|Mary
Address|someCity,someCountry
Age|39

请注意,我采用这种方法是因为 JSON 的模式会随着时间而改变,我们可能会在其中获得更多属性。寻找动态解决方案。

与正则表达式相比,json 解析器可以更好地处理此任务。
这是使用 tExtractJSONFields 组件的解决方案。将循环 Json 查询设置为 $.data[*] 以便在数据数组上循环,并为每个对象获取 NameAddressAge(年龄是约翰无效)。由于您希望输出 key/value 对,因此 tSplitRow 从每个输入行中创建 3 行,名称、地址和年龄分别在单独的行中。然后tFilterRow会过滤掉Age为null的行。

以及组件模式:

这是输出:

.-------+--------------------.
|         tLogRow_1          |
|=------+-------------------=|
|key    |value               |
|=------+-------------------=|
|Name   |John                |
|Address|someCity            |
|Name   |Mary                |
|Address|someCity,somecountry|
|Age    |39                  |
'-------+--------------------'

确保您有一个有效的 json,在您的示例中,您缺少数据内部对象之间的逗号。

编辑:
根据您的要求(动态 JSON),一个简单的解决方案是将您的值中的逗号替换为您的数据中不存在的另一个唯一字符或一组字符(比如 ##),这样它们就不会被标准化器,然后像以前一样解析您的 JSON,最后替换回逗号。

您可以通过在 tNormalize 之前使用 tReplace 替换值内的逗号(而不是“,”之间)来实现此目的。 Select 'Advanced Mode',并使用此模式:

(?<=\w+\s*),(?=\s*\w+)

并替换为##

如果您在逗号前后有空格,我的正则表达式也适用。

完成解析后,使用另一个 tReplace## 替换为“,”