从JSON中提取键值对,并在值中包含逗号

时间:2018-01-11 21:50:01

标签: json talend

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

EG。 我的样本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的模式可能会随着时间的推移而改变,我们可能会在其中获得更多属性。寻找动态解决方案。

1 个答案:

答案 0 :(得分:1)

json解析器比正则表达式更好地处理这个任务 这是使用tExtractJSONFields组件的解决方案。将循环Json查询设置为$.data[*]以循环数据数组,并为每个对象获取NameAddressAge(对于John,Age为null) 。由于您希望输出键/值对,tSplitRow会在每个输入行中创建3行,其中每个行都有一个名称,地址和年龄。然后tFilterRow将过滤掉Age为null的行。

enter image description here

组件架构:

enter image description here

enter image description here

这是输出:

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

确保你有一个有效的json,在你的例子中,你在数据中的对象之间缺少一个逗号。

修改
根据您的要求(动态JSON),一个简单的解决方案是将值中的逗号替换为数据中不存在的另一个唯一字符或字符集(例如##),这样它们就不会被规范化程序接收,然后像以前一样解析你的JSON,最后替换掉逗号。

您可以在tReplace之前使用tNormalize替换值内的逗号(不在“,”之间)来实现此目的。选择“高级模式”,然后使用此模式:

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

并替换为##

如果你在逗号之前或之后有空格,我的正则表达式也有效。

进行解析后,使用其他tReplace##替换为“,”