修复坏Json与字段名称中的未转义报价

时间:2016-01-25 17:08:51

标签: json parsing kissmetrics

当字段名称中有引号时,Kissmetrics导出显然会生成无效的json,例如,以下是生成的事件之一:

{
    "ab test group  native dialogs on mobile":"Control",
    "ab test group  "interested" button copy":"Interested",
    "_t":1412633724,
    "_p":"hk5yxuxcqe/935mkbj+pz8xi0a8="
}

(添加Newlines以澄清问题,我们无法使用它们来修复JSON)。

我正在寻找一种修复这种破JSON的机制。

我相信我们可以利用这些假设:

  • 我们可以假设生成的JSON是平的(没有嵌套对象或数组),所以我认为我们可以利用它。
  • 我认为所有字段都是字符串,除了_t,但不是100%肯定。
  • 我认为我们不能认为不良的未转义报价会平衡。
  • 我相信KM会从字段名称中删除逗号和冒号,但不是100%肯定 - 它们不会从值中删除(尽管我认为值要正确编码)。

1 个答案:

答案 0 :(得分:0)

我正在使用的解决方案,在python中,我确信它是不完美的:

match = regex.match(r'^{("(?P<fieldName>([^:]*))":(?P<fieldValue>([0-9]*\.?[0-9]+)|("(([^"])|(\\"))*"))(,|}))*$', s)

fieldNames = match.captures('fieldName')
fieldValues = match.captures('fieldValue')

newJson = "{%s}" % (
    ",".join(
        "\"%s\":%s" % (
            fieldName.replace("\"", "\\\""),
            fieldValue,
        )
        for fieldName, fieldValue
        in zip(fieldNames, fieldValues)        
    )
)

这假设键中没有冒号。