2010-06-10 7 views
7

Как преобразовать строку JSON в объект в JavaScript? Есть ли способ, который это делает?Как преобразовать строку JSON в объект?

Что-то вроде:

var x = "{ id: 5, name: 'hello' }"; 
var y = /*something*/(x); 

alert(y.id + " " + y.name); 
+0

без или без обрамления (JQuery и т.д.)? – kennytm

+0

(И, пожалуйста, не 'eval'.) – kennytm

+0

jQuery делает это? Как? – BrunoLM

ответ

9

Согласно комментариям и истории вопроса, похоже, что вы уже используете jQuery. В этом случае хорошо знать, что jQuery поставляется с новой функцией parseJSON() с version 1.4.1, которая была выпущена в конце января этого года. Рассмотрите возможность обновления, если вы еще не 1.4.1. Вот выдержка отношения с его API документации:

Описание: Принимает хорошо сформированную строку JSON и возвращает полученный объект JavaScript.

jQuery.parseJSON (JSON) версии добавлены: 1.4.1

JSON Строка JSON для синтаксического анализа.

Передача неправильной строки JSON приведет к исключению исключения. Например, следующие все деформированные JSON строки:

  • {test: 1} (тест не имеет двойные кавычки вокруг него).
  • {'test': 1} ('test' использует одинарные кавычки вместо двойных кавычек).

Кроме того, если вы ничего не передадите, пустая строка, null или undefined, будет возвращена «null» от parseJSON. Если браузер обеспечивает встроенную реализацию JSON.parse, jQuery использует его для синтаксического анализа строки. Подробнее о формате JSON см. http://json.org/.

Пример:

Синтаксический строку JSON.

var obj = jQuery.parseJSON('{"name":"John"}'); 
alert(obj.name === "John"); 
+0

BalusC: Я не удаляю тег 'jquery', но для справок в будущем теги предназначены для * вопроса *, а не для ответов. Вопрос не сужает выбор jQuery, даже если он открыт для jQuery. Из 6 ответов ваш был единственным связанным с jQuery. В принципе, это не вопрос jQuery и не должен быть помечен как таковой. – Blixt

0

Сайт JSON.org дает простое решение:

var y = eval('(' + x + ')'); 

More information

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

+0

Медленный. Больше нечего сказать. – bezmax

+1

@Max: XSS. ____ – kennytm

+0

@KennyTM: Да, забыл об этом. Никогда не использовал eval anyways ... – bezmax

1

Этот пункт полностью покрывает собственные реализации JSON, и библиотеки, которые используют собственные реализации JSON: http://en.wikipedia.org/wiki/JSON#Native_JSON

Использование родной реализации JSON будет значительно быстрее будет/безопаснее, чем при использовании некоторых JavaScript библиотеки для той же задачи. Однако, если какая-то библиотека утверждает, что она будет пытаться использовать встроенную реализацию, когда это возможно - это даже лучший выбор, который использует родной JSON напрямую (совместимость и прочее).

0

вы также можете сделать следующее, которое slighly меньше зла, чем Eval :):

var x = '{ "id": 5, "name": "hello" }'; 

var y = new Function("return " + x)(); 
alert(y.id + " " + y.name); 

Тхо, как сказано другими, если вы используете JQuery, идти на встроенный parseJson метод.

+0

Хороший, но я думаю, что это так же опасно, как 'eval' – BrunoLM

+0

Bruno - механики под крышками разные, и если вы посмотрите на код jquery, вы можете просто увидеть что-то похожее на это в этой функции (parseJSON: function (а)). см. выдержку ниже для функции jquery из источника .. –

2

Бруно,

вот метод JQuery, который, как вы увидите, использует собственную же новую функцию ("вернуться ..) бизнес.

parseJSON: function (a) { 
    if (typeof a !== "string" || !a) return null; 
    if (/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) 
     return z.JSON && z.JSON.parse ? z.JSON.parse(a) : (new Function("return " + a))(); 
    else c.error("Invalid JSON: " + a) 
} 

[править] регулярного выражения это, конечно, «дело» с любыми изгоями символов, встроенных в þér JSon строки.

привидение Тхо :)

+0

, но он использует JSON.parse, где доступно, что, безусловно, является хорошей вещью (tm). Без объекта JSON вряд ли лучший способ сделать преобразование, поскольку создание полного JSON-парсера в JavaScript, несомненно, приведет к чему-то более медленному, чем eval. –

+0

ammoQ - да, абсолютно. просто рад, что они не использовали метод eval как резервный ум :) –

+0

Это безопасно, потому что регулярное выражение +1 для указания его – BrunoLM

Смежные вопросы