конвертировать "преобразованную" строку объекта в JSON или Object - PullRequest
0 голосов
/ 24 января 2011

У меня возникла следующая проблема, и с тех пор, как я обновил свою среду prototypeJS.

синтаксический анализ JSON больше не может преобразовывать эту строку в объект.

"{empty: false, ip: true}"

ранее в версии 1.6это было возможно, и теперь это должна быть «проверенная» строка JSON, такая как

'{"empty": false, "ip": true}'

Но как я могу преобразовать первый пример обратно в объект?

Ответы [ 2 ]

7 голосов
/ 24 января 2011

JSON необходимо заключить все ключи в кавычки, поэтому:

"{empty: false, ip: true}"

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

function preprocessJSON(str) {

    return str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g,
    function(all, string, strDouble, strSingle, jsonLabel) {
        if (jsonLabel) {
            return '"' + jsonLabel + '": ';
        }
        return all;
    });

}

(Попробуйте на JSFiddle) Он использует простое регулярное выражение для замены слова, за которым следует двоеточиес этим словом, заключенным в двойные кавычки.Регулярное выражение не будет заключать в кавычку метку внутри других строк.

Тогда вы можете безопасно

data = JSON.parse(preprocessJSON(json));
1 голос
/ 24 января 2011

Имеет смысл, что анализатор json не принял первый ввод, так как это недопустимый json.В первом примере вы используете нотацию объектов javascript.Это можно преобразовать в объект с помощью функции eval().

var str = "({empty: false, ip: true})";
var obj = eval(str);

Конечно, делать это следует только в том случае, если у вас есть гарантии, что код, который вы будете выполнять, сохраняется.Вы можете найти больше информации о спецификации json здесь .Валидатор json можно найти здесь .

редактировать: приведенный выше тайский ответ, вероятно, является лучшим решением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...