Преобразовать строку объекта в JSON - PullRequest
157 голосов
/ 27 января 2012

Как я могу преобразовать строку, которая описывает объект, в строку JSON, используя JavaScript (или jQuery)?

Например: преобразовать это ( НЕ допустимая строка JSON):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"

в это:

str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

Я хотел бы избежать использования eval(), если это возможно.

Ответы [ 20 ]

174 голосов
/ 27 января 2012

Если строка из доверенного источника , вы можете использовать eval, а затем JSON.stringify результат. Как это:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));

Обратите внимание, что когда вы eval объектный литерал, он должен быть заключен в скобки, в противном случае фигурные скобки анализируются как блок, а не как объект.

Я также согласен с комментариями по этому вопросу, что было бы намного лучше просто сначала кодировать объект в допустимом JSON и избегать необходимости разбирать, кодировать, а затем, вероятно, анализировать его снова . HTML поддерживает атрибуты с одинарными кавычками (просто убедитесь, что HTML-кодирует любые одинарные кавычки внутри строк).

108 голосов
/ 27 января 2012

Ваша строка не является допустимой JSON, поэтому JSON.parse (или jQuery $.parseJSON) не будет работать.

Один из способов - использовать eval для "разбора" "неверного" JSON, а затем stringify для его "преобразования" в действительный JSON.

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
str = JSON.stringify(eval('('+str+')'));

Я предлагаю вместо того, чтобы пытаться "исправить" неверный JSON, вы начинаете с правильного JSON. Как генерируется str, это должно быть исправлено там, до того, как будет сгенерировано, а не после.

РЕДАКТИРОВАТЬ : Вы сказали (в комментариях), что эта строка хранится в атрибуте данных:

<div data-object="{hello:'world'}"></div>

Я предлагаю вам исправить это здесь, так что это может быть просто JSON.parse d. Во-первых, оба ключа и значения должны быть заключены в двойные кавычки. Он должен выглядеть следующим образом (допустимые атрибуты в кавычках в HTML действительны):

<div data-object='{"hello":"world"}'></div>

Теперь вы можете просто использовать JSON.parse (или jQuery $.parseJSON).

var str = '{"hello":"world"}';
var obj = JSON.parse(str);
49 голосов
/ 27 января 2012

jQuery.parseJSON

str = jQuery.parseJSON(str)

Редактировать.Это при условии, что у вас есть допустимая строка JSON

40 голосов
/ 16 декабря 2013

Используйте простой код в ссылке ниже:

http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

и обратный

var str = JSON.stringify(arr);
22 голосов
/ 10 октября 2014

Я надеюсь, что эта маленькая функция преобразует недопустимую строку JSON в действительную.

function JSONize(str) {
  return str
    // wrap keys without quote with valid double quote
    .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":'})    
    // replacing single quote wrapped ones to double quote 
    .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"'})         
}

Результат

var invalidJSON = "{ hello: 'world',foo:1,  bar  : '2', foo1: 1, _bar : 2, $2: 3, 'xxx': 5, \"fuz\": 4, places: ['Africa', 'America', 'Asia', 'Australia'] }"
JSON.parse(invalidJSON) 
//Result: Uncaught SyntaxError: Unexpected token h VM1058:2
JSON.parse(JSONize(invalidJSON)) 
//Result: Object {hello: "world", foo: 1, bar: "2", foo1: 1, _bar: 2…}
9 голосов
/ 27 января 2012

Используйте с осторожностью (из-за eval()):

function strToJson(str) {
  eval("var x = " + str + ";");
  return JSON.stringify(x);
}

позвонить как:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
alert( strToJson(str) );
4 голосов
/ 19 августа 2013

Я разместил свой ответ для тех, кто интересуется этой старой темой.

Я создал HTML5 data- * parser для плагина jQuery и demo , которые конвертируютискаженная строка JSON в объект JavaScript без использования eval().

. Может передавать атрибуты данных data5 * HTML5 ниже:

<div data-object='{"hello":"world"}'></div>
<div data-object="{hello:'world'}"></div>
<div data-object="hello:world"></div>

в объект:

{
    hello: "world"
}
4 голосов
/ 27 января 2012

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

JSON.stringify(eval('(' + str + ')'));

Там я сделал это.
Постарайся не делать этого, но Эвал для тебя ПЛОХО. Как уже было сказано выше, используйте JSON от Crockford для старых браузеров (IE7 и ниже)

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

edit: исправлено в соответствии с предложением Rocket.

2 голосов
/ 28 сентября 2013

Существует гораздо более простой способ выполнить это умение, просто перехватите атрибут onclick фиктивного элемента, чтобы принудительно вернуть вашу строку в виде объекта JavaScript:

var jsonify = (function(div){
  return function(json){
    div.setAttribute('onclick', 'this.__json__ = ' + json);
    div.click();
    return div.__json__;
  }
})(document.createElement('div'));

// Let's say you had a string like '{ one: 1 }' (malformed, a key without quotes)
// jsonify('{ one: 1 }') will output a good ol' JS object ;)

Вот демоверсия: http://codepen.io/csuwldcat/pen/dfzsu (откройте консоль)

2 голосов
/ 27 января 2012

У Дугласа Крокфорда есть конвертер, но я не уверен, что он поможет с плохим JSON в хороший JSON.

https://github.com/douglascrockford/JSON-js

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