Как я могу преобразовать строку, которая описывает объект в строку JSON, используя JavaScript (или jQuery)?
Например: преобразовать это ( НЕ допустимая строка JSON):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
в это:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Я хотел бы избежать использования, eval()
если это возможно.
javascript
json
object
snorpey
источник
источник
data
-attrubute, например, так:<div data-object="{hello:'world'}"></div>
я не хочу использовать одинарные кавычки в HTML (поэтому, вероятно, ей нельзя доверять)<div data-object='{"hello":"world"}'></div>
это 100% правильный HTML (как одиночные кавычки связаны с доверием или нет?). Если вы сделаете это таким образом, вы можете просто,JSON.parse
и это будет работать нормально. Примечание: ключи тоже должны быть в кавычках.<div data-object="{\"hello\":\"world\"}"></div>
. Если вы не хотите использовать действительный JSON в атрибуте, вам придется создать свой собственный формат и проанализировать его самостоятельно.Ответы:
Если строка из доверенного источника , вы могли бы использовать
eval
тоJSON.stringify
результат. Как это:Обратите внимание, что когда вы
eval
объектный литерал, он должен быть заключен в скобки, в противном случае фигурные скобки анализируются как блок, а не как объект.Я также согласен с комментариями под вопросом, что было бы намного лучше просто кодировать объект в допустимом JSON для начала и избегать необходимости разбирать, кодировать, а затем, вероятно, анализировать его снова . HTML поддерживает атрибуты с одинарными кавычками (просто убедитесь, что HTML-кодирует любые одинарные кавычки внутри строк).
источник
eval
преобразует строку в объект JavaScript (который работает, если строка представляет допустимый JavaScript, даже если это недопустимый JSON). ЗатемJSON.stringify
преобразует из объекта обратно в (действительную) строку JSON. Вызовeval
опасен, если строка не из надежного источника, потому что он может буквально запускать любой JavaScript, что открывает возможность межсайтовых скриптовых атак.Ваша строка не является допустимой JSON, поэтому
JSON.parse
(или JQuery's$.parseJSON
) не будет работать.Один из способов - использовать
eval
для «разбора» «недействительный» JSON, а затемstringify
«преобразовать» его в действительный JSON.Я предлагаю вместо того, чтобы пытаться «исправить» ваш неверный JSON, вы начинаете с правильного JSON. Как
str
генерируется, это должно быть исправлено там, до того, как будет сгенерировано, а не после.РЕДАКТИРОВАТЬ : Вы сказали (в комментариях), эта строка хранится в атрибуте данных:
Я предлагаю вам исправить это здесь, так что это может быть просто
JSON.parse
d. Во-первых, оба ключа и значения должны быть заключены в двойные кавычки. Это должно выглядеть так (атрибуты в одинарных кавычках в HTML действительны):Теперь вы можете просто использовать
JSON.parse
(или JQuery$.parseJSON
).источник
jQuery.parseJSON
Редактировать. Это при условии, что у вас есть допустимая строка JSON
источник
Используйте простой код в ссылке ниже:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
и обратный
источник
Я надеюсь, что эта маленькая функция преобразует неверную строку JSON в правильную.
результат
источник
:
находится в одном из значений.Используйте с осторожностью (из-за
eval()
):называть как:
источник
eval()
это единственный способ сделать это. б) Я предупредил ОП об этом. в) Посмотрите на ответ Мэтью Крамли и придумайте лучшее объяснение. (О, и г) утверждениеeval()
плохое - это нонсенс в этой обобщенной форме.)eval("var x = " + str + ";")
что вполне допустимо JS. Вам не нужно делатьvar x = ({a:12})
.json2.js
. Не будь таким счастливым.Отказ от ответственности: не пытайтесь сделать это дома, или для чего-либо, что требует, чтобы другие разработчики относились к вам серьезно:
Там я сделал это.
Постарайся не делать этого, но Эвал для тебя ПЛОХО. Как уже говорилось выше, используйте JSON от Crockford для старых браузеров (IE7 и ниже)
Этот метод требует, чтобы ваша строка была действительным javascript , который будет преобразован в объект javascript, который затем можно сериализовать в JSON.
редактировать: исправлено, как предложено Rocket.
источник
JSON.stringify(eval('('+str+')'));
, не то, чтобы я потворствовалeval
, но его строка не является допустимой JSON, поэтомуJSON.parse
не работает.Я поставил свой ответ для тех, кто заинтересован в этой старой теме.
Я создал анализатор HTML5 data- * для плагина jQuery и демо, которые конвертируют искаженную строку JSON в объект JavaScript без использования
eval()
.Он может передавать атрибуты данных data5 * ниже:
в объект:
источник
У Дугласа Крокфорда есть конвертер, но я не уверен, что он поможет с плохим JSON в хороший JSON.
https://github.com/douglascrockford/JSON-js
источник
Есть намного более простой способ выполнить это умение, просто перехватите атрибут onclick фиктивного элемента, чтобы принудительно вернуть вашу строку как объект JavaScript:
Вот демонстрация: http://codepen.io/csuwldcat/pen/dfzsu (откройте консоль)
источник
Вам нужно использовать «eval», затем JSON.stringify, а затем JSON.parse для результата.
источник
Вы должны писать круглые скобки, потому что без них
eval
код в фигурных скобках будет рассматриваться как блок команд.источник
Ваша лучшая и самая безопасная ставка - JSON5 - JSON for Humans . Он создан специально для этого варианта использования.
источник
Использование новой функции () лучше, чем eval, но все же следует использовать только с безопасным вводом.
Источники: MDN , 2ality
источник
В приведенном выше простом примере вы можете сделать это с помощью двух простых замен регулярных выражений:
Большое предостережение : этот наивный подход предполагает, что у объекта нет строк, содержащих символ
'
или:
. Например, я не могу придумать хороший способ преобразовать следующую строку объекта в JSON без использованияeval
:источник
Просто для причуд, вы можете конвертировать вашу строку через
babel-standalone
источник
var str = "{привет: 'мир', места: ['Африка', 'Америка', 'Азия', 'Австралия']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (Fstr))
Извините, я на своем телефоне, вот картинка.
источник
Решение с одним регулярным выражением и без использования eval:
Я считаю, что это должно работать для нескольких строк и всех возможных вхождений (/ g флаг) «строки» в одинарных кавычках, заменяемых «строкой» в двойных кавычках.
источник
источник
Может быть, вы должны попробовать это:
источник