Строка JSON для объекта JS - PullRequest
       40

Строка JSON для объекта JS

70 голосов
/ 13 февраля 2010

Я использую объект JS для создания графиков с визуализацией Google. Я пытаюсь спроектировать источник данных. Сначала я создал объект JS на стороне клиента.

var JSONObject = {
    cols: [{id: 'date', label: 'Date', type: 'date'},
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'},
        {id: 'soldpens', label: 'Sold Pens', type: 'number'}],
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]},
        {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]},
     {c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}]  
};

var data = new google.visualization.DataTable(JSONObject, 0.5);

Теперь мне нужно получить данные динамически. Поэтому я отправляю запрос AJAX на страницу, которая возвращает строку JSON:

 "cols: [{id: 'date', label: 'Date', type: 'date'},
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'},
{id: 'soldpens', label: 'Sold Pens', type: 'number'}],
  rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]},
      {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]},
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}"

Это я сохраняю в переменную:

var var1 = "cols: [{i ....... 66}]}"

и показывать как

alert(var1);

Теперь моя задача - создать объект JS из этой строки. Это не работает. Когда я использую объект JS, все работает нормально, и я могу получить нужный график. Теперь, если я попытаюсь поместить то же значение строки из запроса AJAX, которое я подтвердил из сообщения с предупреждением, в n-объект, объект не будет создан правильно. Пожалуйста, дайте мне знать ваше мнение и любые исправления или советы.

Ответы [ 5 ]

133 голосов
/ 13 февраля 2010

Некоторые современные браузеры поддерживают синтаксический анализ JSON в собственном объекте:

var var1 = '{"cols": [{"i" ....... 66}]}';
var result = JSON.parse(var1);

Для браузеров, которые его не поддерживают, вы можете скачать json2.js с json.org для безопасного анализа объекта JSON. Сценарий проверит наличие встроенной поддержки JSON и, если она не существует, предоставит глобальный объект JSON. Если более быстрый, нативный объект доступен, он просто выйдет из сценария, оставив его без изменений. Однако вы должны предоставить действительный JSON, иначе он выдаст ошибку & mdash; Вы можете проверить действительность JSON с помощью http://jslint.com или http://jsonlint.com.

5 голосов
/ 13 февраля 2010

строка в вашем вопросе не является допустимой строкой json. С сайта json.org :

JSON построен на двух структурах:

* A collection of name/value pairs. In various languages, this is 
  realized as an object, record, struct, dictionary, hash table, keyed list, or
  associative array.
* An ordered list of values. In most languages, this is realized as an
  array, vector, list, or sequence.

Обычно строка json всегда начинается с {или [.

Тогда, как сказали @Andy E и @Cryo, вы можете проанализировать строку с помощью json2.js или некоторых других библиотек.

ИМХО, вам следует избегать eval, потому что он подойдет для любой javascript-программы, поэтому вы можете столкнуться с проблемами безопасности.

5 голосов
/ 13 февраля 2010

Вы можете использовать eval (jsonString), если доверяете данным в строке, в противном случае вам нужно будет их правильно проанализировать - проверьте json.org на наличие примеров кода.

4 голосов
/ 13 февраля 2010

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

var var1_obj = JSON.parse(var1);

Или вы также можете использовать библиотеку jquery-json .

var var1_obj = $.toJSON(var1);
3 голосов
/ 13 февраля 2010

Возвращаемая строка не является допустимым JSON. Имена в объектах должны быть заключены в кавычки, а вся строка должна быть помещена в { … } для формирования объекта. JSON также не может содержать что-то вроде new Date(). JSON - это небольшое подмножество JavaScript, содержащее только строки, числа, объекты, массивы, true, false и null.

См. Грамматику JSON для получения дополнительной информации.

...