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

从值中包含逗号的JSON中提取键值对,json,talend,Json,Talend,我正在尝试解析JSON,并希望将键值对作为输出。我已经使用tNormalize在逗号上拆分,然后使用tExtractRegex转换为键值对。直到有一天我在JSON值中得到了一个逗号,这一切都很正常。然而,这个逗号位于引号之间,因此JSON是有效的,但是由于tNormalize组件是用逗号分割的,所以它也使用这些逗号进行分割 例如。 我的JSON示例: { "PQR":"XYZ", "data":[ { "Name":"John","Address":"someCity" }, { "Name":

我正在尝试解析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解析器更好地处理此任务。
下面是一个使用
textracjsonfields
组件的解决方案。将循环Json查询设置为
$.data[*]
,以便在数据数组上循环,并为每个对象获取
名称
地址
年龄
(John的年龄为空)。由于您希望在输出中使用键/值对,因此
tSplitRow
会在每个输入行中创建3行,并将名称、地址和年龄分别放在单独的行中。然后
tFilterRow
将过滤掉年龄为空的行

以及组件架构:

以下是输出:

.-------+--------------------.
|         tLogRow_1          |
|=------+-------------------=|
|key    |value               |
|=------+-------------------=|
|Name   |John                |
|Address|someCity            |
|Name   |Mary                |
|Address|someCity,somecountry|
|Age    |39                  |
'-------+--------------------'
确保您有一个有效的json,在您的示例中,数据中的对象之间缺少一个逗号

编辑:
根据您的需求(动态JSON),一个简单的解决方案是将值中的逗号替换为数据中不存在的另一个唯一字符或字符集(例如##),这样规范化程序就不会提取它们,然后像以前一样解析JSON,最后替换回逗号

可以通过在
t标准化
之前使用
t替换值内的逗号(而不是“,”)来实现这一点。选择“高级模式”,并使用此模式:

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

(?更正了上述问题中的JSON。我以前曾想过使用这种方法,但JSON的模式是动态的,属性会随着时间的推移而变化(例如,JSON后面可能还会添加“性别”属性)这就是为什么我们不能使用TeXractJSONFAR组件,因为它需要一个固定的模式。我已经为我的测试修正了。我做了基于有效JSON的例子。如果它适合你的需要,请考虑接受这个答案。请看我更新的答案;我已经提出了一个基于你的新需求的简单解决方案。我保留了我以前的ANSWE。以防其他人需要做同样的事情。做了同样的事情。工作完美!