[javascript] 객체 문자열을 JSON으로 변환

JavaScript (또는 jQuery)를 사용하여 객체를 설명하는 문자열을 JSON 문자열로 변환하려면 어떻게해야합니까?

예 :이 (변환 하지 유효한 JSON 문자열) :

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

이것으로 :

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

eval()가능한 경우 사용을 피하고 싶습니다 .



답변

문자열이 원본을 신뢰할 경우 , 당신은 사용할 수있는 eval다음 JSON.stringify결과를. 이처럼 :

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

이 때주의 eval객체 리터럴은 괄호에 싸여되어야한다 그렇지 않으면 중괄호 블록 대신 대상으로 분석된다.

또한 유효한 JSON으로 객체를 인코딩하여 구문 분석, 인코딩 및 다시 구문 분석하지 않아도되는 것이 훨씬 낫다는 질문 아래 의견에 동의 합니다 . HTML은 작은 따옴표 속성을 지원합니다 (문자열 안에 작은 따옴표를 HTML로 인코딩해야합니다).


답변

문자열이 유효한 JSON이 아니므로 JSON.parse(또는 jQuery ‘s $.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.parsed 일 수 있습니다 . 먼저 키와 값을 모두 큰 따옴표로 묶어야합니다. 다음과 같아야합니다 (HTML의 작은 따옴표로 묶은 속성이 유효 함).

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

이제 JSON.parse(또는 jQuery ‘s $.parseJSON)를 사용할 수 있습니다 .

var str = '{"hello":"world"}';
var obj = JSON.parse(str);


답변

jQuery.parseJSON

str = jQuery.parseJSON(str)

편집하다. 유효한 JSON 문자열이 제공됩니다.


답변

아래 링크에서 간단한 코드를 사용하십시오.

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);


답변

이 작은 함수가 잘못된 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…}


답변

주의해서 사용하십시오 eval():

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

전화 :

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
alert( strToJson(str) );


답변

면책 조항 : 집에서 또는 다른 개발자가 당신을 심각하게 생각하는 것을 요구하지 마십시오 :

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

나는 그것을했다.
eval은 당신에게 나쁜 것입니다. 위에서 언급했듯이 구형 브라우저 (IE7 이하)에는 Crockford의 JSON shim을 사용하십시오.

이 방법을 사용하려면 문자열이 유효한 javascript 이어야하며 , 이는 javascript 객체로 변환 된 다음 JSON으로 직렬화 될 수 있습니다.

편집 : 로켓이 제안한대로 수정되었습니다.