2016-01-25 22 views
0

Kissmetrics出口显然产生无效的JSON当存在字段名称报价,例如,以下是产生的事件之一:修复坏的Json与字段名称转义的报价

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

(换行了补充说明了这个问题,我们不能用这些来修复JSON)。

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

有索姆假设,我相信我们能够充分利用:

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

这是一个棘手的问题,因为它很含糊 - 很难说是否感兴趣是一个新的属性或应该在属性名称中转义。我会考虑一个可以识别行的正则表达式(例如,“既没有后面跟着一个:也没有前面跟着一个,可选空白)。这不是完美的,但是如果这些都是属性名称,你可以开始生成一些规则表达式来修复字符串,我建议尝试一下,运行导入和导出任何无法解析并在正则表达式上迭代的东西,以便快速修复。 –

+1

对于此特定问题,事实证明,KM提供了一个脚本修复他们不好的JSON:https://gist.github.com/clay-whitley/8309396 –

回答

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)   
    ) 
) 

这假设有在钥匙没有冒号。