2012-03-14 55 views
1

我有一個JSON字符串,我可以從網站上刮取。我只需要如下數據(原始字符串是更長的時間),這是檢索JSON這我打算轉換成一個Ruby的Hash:修復/消耗具有前導零(0)的無效JSON數字?例如「03」

{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00} 

我使用正則表達式檢索上述JSON

targetDate:\s+(.*?)}\)/m 

由於整數中多餘的零,我無法解析上面的json。 (00和03) 我嘗試使用3而不是03和0來手動更改數字,而不是00,它工作!

所以,我猜JSON解析器可能無法看到這種類型的數字。

問題是,如何清理上面檢索到的JSON以刪除不必要的零。也就是,

{"day": 15, "month": 3, "year": 2012, "hour": 10, "min": 0, "sec": 0} 

感謝您的幫助!

+0

這是錯誤消息當我嘗試分析它:_710:15,‘月’:在「{‘天’意外的標記: 03,「year」:2012,「hour」:10,「min」:00,「sec」:00}'_ – nmenego 2012-03-14 07:22:27

+0

你是對的。我忘了JSON *禁止*數字(除了0.xyz)從零開始。 – 2012-03-14 07:24:37

+0

小修正:JSON禁止任何數字,除了*'0'本身*和'0.xyz'以零開始。 – 2017-07-05 19:11:51

回答

1

,而不是正則表達式帶來的,也許只是EVAL它:

hash = eval '{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}'.gsub(': ', ' => ') 
+0

嘿!又是你!測試之後,您的答案仍然有效。更簡單,更清潔!謝謝! – nmenego 2012-03-14 08:00:14

+1

不客氣。如果可能存在惡意代碼,請不要這樣做。 – pguardiario 2012-03-14 08:21:25

+0

沒關係。我只是爲了練習而使用它。但正如我一直在閱讀的,他們說使用eval並不是一個好主意。 – nmenego 2012-03-14 08:43:05

0
json.gsub(/(?<=[: ])0+(\d+,)/, "\\1") 

請記住,你可能有JSON像{ "someKey": "james bond: 007" },這將被替換到{ "someKey": "james bond: 7" }

json.gsub(/("\w")\s+:\s+0+(\d+)\s+,/, "\\1: \\2,") 

看起來更好,但它也可以「勝過」這個正則表達式。 正則表達式並不適合這類問題。

好的,我這裏還有非正則表達式的解決方案:

var inString = false; # check, whether current char is in string. Think of it as whether current symbol would be highlighted as string constant in editor 
var out = []; # array/stack for output 
var prevChar = null; # previous char. One may init to space symbol or even replace it with `out[-1]` everywhere 
for (chr in jsonStr) { # iterate over symbols (chars) of a string 
    if (char == '"' && prevChar != "\\") inString = !inString; 
    if (!isDigit(out[-2]) 
    && prevChar == '0' 
    && isDigit(chr)) { # i.e. last 3 chars match /(\D)0(\d)/ 
     out[-1] = prevChar = chr; # make it \1\2 
    } else { 
     out.push(prevChar = chr); # just continue building string 
    } 
} 
out.join(""); 

考慮它的僞代碼等JavaScript和未經測試。

+0

我發現,這段代碼在像'\\「這樣的字符串上工作不正確 – kirilloid 2012-03-29 19:11:01

1

試試這個正則表達式

json = '{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}' 
json.gsub(/\b0*(\d+)/, '\1') 
#=> {"day": 15, "month": 3, "year": 2012, "hour": 10, "min": 0, "sec": 0} 

編輯:

雖然不是絕對必要的(見註釋),該\b字邊界確保只有在數開始0可以匹配。

+0

將年份:2012年改成爲年份:212'並且從所有數字中除去最後的零 – kirilloid 2012-03-14 07:27:06

+0

@kirilloid:我也曾這麼想過,但實際上並沒有這樣做。匹配'2012'時,'0 *'部分看着'2'並失敗,所以'\ d +'匹配'2012',一切正常。但是我會在開始時通過添加一個'\ b'字邊界來明確它,因爲這有點違反直覺。 – 2012-03-14 07:30:51

+0

謝謝你。它實際上工作。 'test = JSON。解析('{「day」:15,「month」:03,「year」:2012,「hour」:10,「min」:00,「sec」:00}'。gsub(/ 0 *(\ d + )/,'\ 1'))#=> test ['year']給出了2012 – nmenego 2012-03-14 07:34:01