Проблема разбора JSON - PullRequest
       3

Проблема разбора JSON

3 голосов
/ 22 ноября 2010

Я сталкиваюсь с проблемами при использовании стороннего веб-сервера в формате JSON.Ответ JSON от сервера выглядит примерно так:

{
    "ID":10079,
    "DateTime":new Date(1288384200000),
    "TimeZoneID":"W. Europe Standard Time",
    "groupID":284,
    "groupOrderID":10
}

Я использую JavaScript без дополнительных библиотек для анализа JSON.

//Parse JSON string to JS Object            
var messageAsJSObj = JSON.parse(fullResultJSON);

Сбой анализа.Валидатор JSON сообщает мне, что «новая дата (1288384200000)» недействительна.

Существует ли библиотека, которая может помочь мне разобрать строку JSON?

Ответы [ 4 ]

5 голосов
/ 22 ноября 2010

Как и другие указали, это недопустимый JSON. Одним из решений является использование eval() вместо JSON.parse(), но вместо этого возникает потенциальная проблема безопасности.

Лучшим подходом может быть поиск и замена этих проблемных вопросов, превращая данные в действительный JSON:

fullResultJSON = fullResultJSON.replace(/new Date\((\d+)\)/g, '$1');

Вы даже можете пойти еще дальше и «оживить» эти поля в объектах JavaScript Date, используя второй аргумент для JSON.parse():

var messageAsJSObj = JSON.parse(fullResultJSON, function (key, value) {
    if (key == "DateTime")
        return new Date(value);

    return value;
}); 

Вот пример: http://jsfiddle.net/AndyE/vcXnE/

3 голосов
/ 22 ноября 2010

Ваш пример не является допустимым JSON, поскольку JSON - это технология обмена данными. Вы можете превратить ваш пример в объект Javascript, используя eval:

var almostJSON = "{
    "ID":10079,
    "DateTime":new Date(1288384200000),
    "TimeZoneID":"W. Europe Standard Time",
    "groupID":284,
    "groupOrderID":10,
}";

и затем eval ing it:

var myObject = eval('(' + almostJSON + ')');

Тогда myObject должно содержать то, что вы ищете.

Обратите внимание, что функции не разрешены в JSON, поскольку это может поставить под угрозу безопасность.

0 голосов
/ 22 ноября 2010

Сбой разбора, потому что все, что вы можете анализировать в объекте json, это нуль, строки, числа, объекты, массивы и логические значения, поэтому new Date(1288384200000), не может быть проанализирован

У вас есть и другая проблема, у последнего свойства не должно быть запятой.

0 голосов
/ 22 ноября 2010

try var obj = eval ('(' + fullResultJSON + ')');и у тебя будет объект, как сказал Пекка.Не забудьте использовать дополнительную '()', хотя.И действительно, json должен иметь свойство и значение в кавычках.

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