使用前导零(0)修复/使用无效的JSON数字?例如“03”

时间:2012-03-14 06:59:42

标签: ruby regex json parsing nokogiri

我有一个JSON字符串,我可以从网站上抓取。我只需要以下数据(原始字符串更长)以下是我计划转换为Ruby Hash的检索到的JSON:

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

我使用正则表达式检索了上面的json:

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

由于整数中有额外的零,我无法解析上面的json。 (00和03) 我尝试使用3而不是03而不是00来手动更改数字并且它有效!

所以,我猜json解析器可能无法查看那种数字。

问题是,如何清除上面检索到的JSON以删除不必要的零。也就是说,

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

感谢您的帮助!

3 个答案:

答案 0 :(得分: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字边界确保只能匹配数字开头的零。

答案 1 :(得分:1)

不是引入正则表达式,也许只是评估它:

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

答案 2 :(得分:0)

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

请注意,您可能拥有{ "someKey": "james bond: 007" }这样的json,它将被替换为{ "someKey": "james bond: 7" }

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

看起来更好,但也有可能“超越”这个正则表达式。 Regexp并不适合这类问题。

好的,这是非正则表达式解决方案:

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这样的伪代码,而不是经过测试。