Исправить / использовать неверные числа JSON с ведущими нулями (0)?например, "03" - PullRequest
1 голос
/ 14 марта 2012

У меня есть строка JSON, которую я смог почистить с веб-сайта. Мне нужны были только следующие данные (исходная строка намного длиннее). Вот полученный JSON, который я планирую преобразовать в Ruby Hash:

{"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}

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Попробуйте это регулярное выражение

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}

EDIT:

Хотя это и не является строго обязательным (см. Комментарии), граница слова \b обеспечивает совпадение только нулей в начале числа.

1 голос
/ 14 марта 2012

Вместо того, чтобы вводить регулярное выражение, возможно, просто оцените его:

hash = eval '{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}'.gsub(': ', ' => ')
0 голосов
/ 14 марта 2012
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, и не проверен.

...