从值中包含逗号的 JSON 中提取键值对
Posted
技术标签:
【中文标题】从值中包含逗号的 JSON 中提取键值对【英文标题】:Extract Key Value Pair from JSON having commas in the value 【发布时间】:2018-01-11 21:50:00 【问题描述】:我正在尝试解析 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 的架构会随着时间而改变,我们可能会在其中获得更多属性。寻找动态解决方案。
【问题讨论】:
【参考方案1】:json 解析器比正则表达式更好地处理此任务。
这是使用tExtractJSONFields
组件的解决方案。将循环 Json 查询设置为 $.data[*]
以便在数据数组上循环,并为每个对象获取 Name
、Address
和 Age
(John 的年龄为空)。由于您需要输出键/值对,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
来替换值内的逗号(而不是在“,”之间)来实现此目的。选择“高级模式”,并使用此模式:
(?<=\w+\s*),(?=\s*\w+)
并替换为##
如果逗号前后有空格,我的正则表达式也可以使用。
完成解析后,使用另一个tReplace
将##
替换为“,”
【讨论】:
更正了上述问题中的 JSON。我之前考虑过使用这种方法,但是 JSON 的模式是动态的,并且属性会随着时间而变化(例如,稍后在 JSON 中可能还会添加“性别”属性),这就是我们不能使用 tExtractJSONFields 组件的原因它需要一个固定的架构。 我已经为我的测试更正了它。我基于有效的 json 做了我的例子。如果它适合您的需要,请考虑接受答案。 请看我更新的答案;我已经根据您的新要求提出了一个简单的解决方案。我保留了之前的答案,以防其他人需要做同样的事情。 做了同样的事情。完美运行!以上是关于从值中包含逗号的 JSON 中提取键值对的主要内容,如果未能解决你的问题,请参考以下文章
将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)
仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值