2016-01-25 24 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)   
    ) 
) 

這假設有在鑰匙沒有冒號。