JSON.stringify의 반대?


338

나는 같은 물건을 끈으로 묶고있다. {'foo': 'bar'}

문자열을 객체로 되돌릴 수있는 방법은 무엇입니까?


6
{foo: 'bar'}(유효한 자바 스크립트 표현 동안) 유효 JSON 없습니다.
leemes

2
JSON.parse를 사용해보십시오. 브라우저는 지원이없는 경우 다음 json2.js를 시도
Anirudha 굽타

10
우리는 여기서 롤캣을 다루고 있습니다.
Pointy

1
어쩌면 JSON.parse를 수행해야한다는 또 다른 답변을 추가했을 것입니다.
Titouan de Bailleul

33
@RobW, 귀하의 Google 링크 가이 질문을 최고의 인기라고 지적합니다. #ironic
체이스 플 로렐

답변:


501

JSON.parse()문자열 이 필요 합니다.

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}


8
전문가 팁 : 메소드가 Node / J를 충돌시킬 수 있으므로 항상 JSON.parse ()를 try-catch 구조에 넣으십시오
Spock


62

JSON.stringify그리고 JSON.parse거의 oposites하고, "보통"이런 종류의 작동합니다 :

var obj = ...;
var json = JSON.stringify(obj);  
var obj2 = JSON.parse(json);

obj와 obj2가 "동일"하도록합니다.

그러나 알아야 할 몇 가지 제한 사항이 있습니다. 간단한 객체를 다룰 때 이러한 문제는 중요하지 않습니다. 그러나이 도우미 함수를 사용하여 여기에 그중 일부를 설명하겠습니다.

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • ownProperties객체를 얻고 프로토 타입을 잃게됩니다.

    var MyClass = function() { this.foo="foo"; } 
    MyClass.prototype = { bar:"bar" }
    
    var o = new MyClass();
    var oo = jsonrepack(o);
    console.log(oo.bar); // undefined
    console.log( oo instanceof MyClass ); // false
    
  • 당신은 정체성을 잃을 것입니다 :

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
    
  • 기능은 살아남지 못한다 :

    jsonrepack( { f:function(){} } ); // Returns {}
  • 날짜 객체는 문자열로 끝납니다.

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • 정의되지 않은 값은 살아남지 않습니다.

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
    
  • toJSON기능 을 제공하는 개체 는 올바르게 작동하지 않을 수 있습니다.

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'
    

다른 내장 유형에도 문제가 있다고 확신합니다. (이 모든 것은 node.js를 사용하여 테스트되었으므로 환경에 따라 약간 다른 동작이 발생할 수 있습니다).

중요한 경우 JSON.parse및 의 추가 매개 변수를 사용하여 극복 할 수 있습니다 JSON.stringify. 예를 들면 다음과 같습니다.

function MyClass (v) {
   this.date = new Date(v.year,1,1);
   this.name = "an object";
};

MyClass.prototype.dance = function() {console.log("I'm dancing"); }

var o = new MyClass({year:2010});
var s = JSON.stringify(o);

// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
  if(k==="") { 
     var rv = new MyClass(1990,0,0);
     rv.date = v.date;
     rv.name = v.name;
     return rv
  } else if(k==="date") {
    return new Date( Date.parse(v) );
  } else { return v; } } );

console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance();                  // I'm dancing

console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]        
o2.dance();                 // I'm dancing

1
는 당 "JSON은 완전히 C, C ++, C #을, 자바, 자바 스크립트, 펄, 파이썬, 그리고 많은 다른 사람을 포함하여 언어의 C-가족의 프로그래머들에게 익숙한 언어 독립적 만 사용 규칙입니다 텍스트 형식입니다." . 나에게 이것은 JSON이 언어에 구애받지 않는 유형 / 데이터에만 사용해야한다고 말합니다. 따라서 귀하의 예제 (유효하지만)는 JavaScript와 관련하여 JSON에만 관련되며 실제 JSON이 아닌 JSONP로 더 정의되어야합니다 ... IMOJSON SPEC
Chase Florell

이에 대한 한 가지 예는 { bar:"bar" }프로토 타입 의 문자열이 문자열이 아니라 변수 이므로 유효한 json으로 간주되지 않는다는foo 것입니다. 유효한 json은 key이어야합니다 string.
체이스 플 로렐

3
OP를 읽었습니다. "자바 스크립트 개체를 JSON 문자열로 변환 한 후 다시 변환하고 싶습니다. 어떻게해야합니까?" 다른 모든 답변은 그냥 사용한다고 말합니다 JSON.parse. 제대로 처리하지 못하는 많은 사례가 있음을 경고합니다. 순수한 원시 데이터 (클래스, 프로토 타입 없음)를 사용하고 JSON에서 지원하는 데이터 유형 (날짜, XML, HTML 등 없음)을 사용하고 있다면 괜찮습니다.
Michael Anderson

또한, 자바 스크립트 X = { foo:"bar" }와 동일 X = { "foo":"bar" }동일로되는 X = {}; X.foo = "bar"것과 같은 어떤 X={}; X["foo"] = "bar"생성 된 오브젝트 4의 경우와 동일하다. 생성 된 JSON의 유효성에는 차이가 없습니다.
Michael Anderson

2
이것은 매우 포괄적 인 답변이며 허용되는 답변에 훨씬 더 적합합니다. 훌륭한 작업에 감사드립니다.
scubbo

6

http://jsbin.com/tidob/1/edit?js,console,output

기본 JSON 객체에는 두 가지 주요 방법이 있습니다.

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()메소드는 JSON 문자열을 구문 분석합니다. 즉, 원래 JavaScript 오브젝트 재구성

    var jsObject = JSON.parse(jsonString);

  2. JSON.stringify () 메서드는 JavaScript 객체를 허용하고 해당 JSON을 반환합니다.

    var jsonString = JSON.stringify(jsObject);



5

이건 어때요

var parsed = new Function('return ' + stringifiedJSON )();

이것은보다 안전한 대안입니다 eval.


2

이것 좀 봐.
http://jsfiddle.net/LD55x/

암호:

var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);

-3
$("#save").click(function () {
    debugger
    var xx = [];
    var dd = { "firstname": "", "lastname": "", "address": "" };
    var otable1 = $("#table1").dataTable().fnGetData();

    for (var i = 0; i < otable1.length; i++) {
        dd.firstname = otable1[i][0];
        dd.lastname = otable1[i][1];
        dd.address = otable1[i][2];
        xx.push(dd);
        var dd = { "firstname": "", "lastname": "", "address": "" };
    }
    JSON.stringify(alert(xx));
    $.ajax({

        url: '../Home/save',
        type: 'POST',
        data: JSON.stringify({ u: xx }),
        contentType: 'application/json;',
        dataType: 'json',
        success: function (event) {
            alert(event);
            $("#table2").dataTable().fnDraw();
            location.reload();
        }
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.