자바 스크립트 객체 대 JSON


208

Javascript 객체와 JSON 문자열의 기본 차이점을 명확하게 이해하고 싶습니다.

다음 JS 변수를 생성한다고 가정 해 봅시다.

var testObject = {one: 1,"two":2,"three":3};

Q1. 키 / 프로퍼티 이름이 따옴표를 포함하거나 포함하지 않고 모두 유효합니까? (예 :"one" : 1 )

그렇다면 차이점은 무엇입니까?

Q2 :를 사용하여 위의 객체를 변환 JSON.stringify(testObject)하면 원래 JS 객체와 JSON의 차이점은 무엇입니까?

나는 그들이 거의 같다고 생각합니다. 이것에 대해 자세히 설명하십시오.

Q3 : JSON 문자열을 구문 분석 할 때 아래 방법이 권장됩니까?

var javascriptObj = JSON.parse(jSonString);

답변:


239
  1. 키 / 프로퍼티 이름은 따옴표를 포함하거나 포함하지 않고 유효합니까?

    키는 특수 문자를 (포함하는 경우 객체 리터럴 표기법을 사용할 때 따옴표로 키를 묶어야합니다 유일한 시간은 if, :, -등). 그것은 JSON에 키가 있음을 주목할 가치가 있어야합니다 묶어야 이중 따옴표.

  2. 를 사용하여 위의 객체를 JSON으로 변환하면 var jSonString = JSON.stringify(testObject);2 (JS obj와 JSON)의 차이점은 무엇입니까?

    JSON 은 데이터 교환 형식입니다. 정렬 된 목록과 정렬되지 않은 맵, 문자열 부울 및 숫자를 문자열로 표현하는 방법을 설명하는 표준입니다. XML과 YAML이 언어간에 구조화 된 정보를 전달하는 방법 인 것처럼 JSON도 동일합니다. 반면에 JavaScript 객체는 물리적 유형입니다. C ++ 클래스 / 구조체 인 PHP 배열과 마찬가지로 JavaScript 객체는 JavaScript 내부의 유형입니다.

    이야기가 있습니다. 상점에서 일부 가구를 구입했으며 배송을 원한다고 가정 해 봅시다. 그러나 재고가 남아있는 유일한 것은 디스플레이 모델이지만 귀하는 그것을 구매하기로 동의합니다.

    상점에서 구입 한 서랍장은 살아있는 물건입니다.

    var chestOfDrawers = {
        color: "red",
        numberOfDrawers: 4
    }

    그러나 게시물에 서랍장을 보낼 수 없으므로 게시물을 해체하십시오 (읽고 문자열 화). 이제는 가구면에서 쓸모가 없습니다. 이제 JSON입니다. 플랫 팩 형태입니다.

    {"color":"red","numberOfDrawers":4}

    당신이 그것을받을 때, 당신은 서랍장을 다시 작성 (읽고 구문 분석). 이제 객체 형태로 돌아 왔습니다.

    JSON / XML 및 YAML의 이유는 프로그래밍 언어간에 데이터를 모두 참여 언어가 이해할 수있는 형식으로 전송할 수 있기 때문입니다. PHP 또는 C ++에 JavaScript 객체를 직접 제공 할 수 없습니다. 각 언어는 실생활에서 다르게 개체를 나타 내기 때문입니다. 그러나 객체를 JSON 표기법으로 문자열 화했기 때문에; 즉, 데이터를 표현하는 표준화 된 방법으로 , 객체 의 JSON 표현 을 다른 언어 (C ++, PHP)로 전송할 수 있으며, 객체 의 JSON 표현을 기반 으로 자신의 객체로 JavaScript 객체를 다시 생성 할 수 있습니다 .

    JSON은 함수 나 날짜를 나타낼 수 없습니다. 함수 멤버로 객체를 문자열 화하려고하면 JSON 표현에서 함수가 생략됩니다. 날짜는 문자열로 변환됩니다.

    JSON.stringify({
        foo: new Date(),
        blah: function () { 
            alert('hello');
        }
    }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
  3. JSON 문자열을 구문 분석 할 때 아래 방법이 권장됩니까? var javascriptObj = JSON.parse(jSonString);

    예, 그러나 이전 브라우저는 기본적으로 JSON을 지원하지 않습니다 (IE <8) . 이를 지원하려면를 포함해야합니다 json2.js.

    jQuery를 사용하는 경우을 호출 할 수 있습니다. 지원되는 경우 후드에서 jQuery.parseJSON()사용 JSON.parse()되며 그렇지 않으면 입력을 구문 분석하기 위해 사용자 정의 구현으로 대체됩니다.


4
@testndtv 당신은 요점을 놓쳤다-종이 (또는 화면)에서 JSON 문자열과 JS 객체 의 표시 가 동일하게 보일지 모르지만 그것들은 동일하지 않습니다. JSON은 객체를 문자열로 묶는 방법 일 뿐이므로 다른 곳으로 옮겨 나중에 객체로 압축을 풀 수 있습니다.
Alnitak

1
@Matt 가난한 비유 IMHO-JSON은 메소드가있는 객체를 직렬화하는 데 사용해서는 안됩니다-순수한 데이터 객체에 대해서만.
Alnitak

1
따라서 JS 객체에 메소드가있는 경우 JSON 문자열로 변환하면 완전히 무시합니다 ... 위의 경우와 같이 getIn 및 getOut은 완전히 무시됩니다 ... 그게 어떻게 작동합니까?
testndtv

3
@Growler : "thing"을 서버에서 생성 해야하는 경우 일반적으로 JSON을 사용하고 "thing"을 그대로 제공 하는 경우 js 파일을 사용합니다 . 다른 큰 차이점은 JSON이 나타낼 수 없으므로 함수 및 / 또는 날짜를 포함 해야하는지 여부입니다. 따라서 JS 파일 제공에 의존해야합니다. 그래도 확실하지 않다면 Stack Overflow에 대한 별도의 질문으로 자유롭게 질문하십시오 (대화 상자를 나타 내기 위해 제공 해야하는 내용의 예를 보여주십시오). 좀 더 자세히 살펴 볼게요!
Matt

4
@ 매트 당신은 선생님, 천재입니다! 귀하의 설명은 명확하고 간결하며 이해하기 쉽습니다. 내 JavaScript / 프로그래밍 멘토 였으면 좋겠다.
FrankDraws

30

Q1 : 자바 스크립트에서 객체 리터럴을 정의 할 때 키에 따옴표가 포함되거나 포함되지 않을 수 있습니다. 따옴표를 사용하면 인터프리터가 직접 시도한 경우 구문 분석에 실패하는 특정 키를 지정할 수 있다는 점을 제외하고는 차이가 없습니다. 예를 들어 느낌표 인 키를 원하면 따옴표가 필요합니다.

a = { "!": 1234 } // Valid
a = { !: 1234 } //  Syntax error

그러나 대부분의 경우 객체 리터럴의 키 주위에 따옴표를 생략 할 수 있습니다.

Q2 : JSON은 문자 그대로 문자열 표현입니다. 그것은 단지 문자열입니다. 따라서 이것을 고려하십시오 :

var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);

testObject실제 객체 이므로 속성을 호출하고 객체로 할 수있는 다른 작업을 수행 할 수 있습니다.

testObject.hello => "world"

반면 jsonString에 문자열은 다음과 같습니다.

jsonString.hello => undefined

다른 한 가지 차이점에 유의하십시오. JSON에서는 모든 키를 따옴표로 묶어야합니다. 이는 Q1의 설명에 따라 일반적으로 따옴표를 생략 할 수있는 객체 리터럴과 대조됩니다.

Q3. 을 사용하여 JSON 문자열을 구문 분석 할 수 JSON.parse있으며 이는 일반적으로이를 수행하는 가장 좋은 방법입니다 (브라우저 또는 프레임 워크에서 제공하는 경우). evalJSON은 유효한 자바 스크립트 코드이기 때문에 사용할 수도 있지만 여러 가지 이유로 이전 방법을 사용하는 것이 좋습니다 (평가에는 많은 불쾌한 문제가 있습니다).


9

JSON으로 해결 된 문제

두 컴퓨터간에 일반 JavaScript 객체를 교환하고 다음 두 규칙을 설정한다고 가정 해 보겠습니다.

  • 전송 된 데이터는 일반 문자열이어야합니다.
  • 속성 만 교환 할 수 있으며 메소드는 전송되지 않습니다.

이제 첫 번째 호스트에 두 개의 객체를 만듭니다.

var obj1 = { one: 1,"two":2,"three":3 }; // your example
var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };

두 번째 호스트로 전송하기 위해 이러한 객체를 어떻게 문자열로 변환 할 수 있습니까?

  • 첫 번째 객체의 경우이 문자열을 리터럴 정의 형식으로 보낼 수 '{ one: 1,"two":2,"three":3 }'있지만 실제로는 문서의 스크립트 부분에서 리터럴을 읽을 수는 없습니다 (적어도 쉽지는 않습니다). 그래서 obj1obj2실제로 동일한 방식으로 처리해야합니다.
  • 모든 속성과 해당 값을 열거하고 객체 리터럴과 유사한 문자열을 작성해야합니다.

JSON은 방금 논의 된 요구에 대한 솔루션으로 작성되었습니다. 모든 속성과 값을 나열하여 객체와 동등한 문자열을 작성하는 규칙 세트입니다 (방법은 무시 됨).

JSON은 속성 이름 및 값에 큰 따옴표 사용을 표준화합니다.

JSON은 일련의 규칙 일뿐입니다 (표준).

몇 개의 JSON 객체가 생성됩니까?

하나만 JS 엔진에 의해 자동으로 생성됩니다.

브라우저에서 사용되는 최신 JavaScript 엔진에는 JSON이라는 기본 객체가 있습니다. 이 JSON 객체는 다음을 수행 할 수 있습니다.

  • JSON.parse (string)를 사용하여 JSON 표준을 사용하여 작성된 문자열을 디코딩하십시오. 결과는 JSON 문자열에 속성과 값이있는 일반적인 JS 객체입니다.

  • JSON.stringify ()를 사용하여 일반 JS 객체의 속성 / 값을 인코딩합니다. 결과는 JSON 규칙 세트를 준수하는 문자열입니다.

(단일) JSON 객체는 코덱과 비슷하며 인코딩 및 디코딩하는 기능입니다.

참고 :

  • JSON.parse ()는 JSON 객체를 생성하지 않고 일반적인 JS 객체를 생성하며 객체 리터럴을 사용하여 생성 된 객체와 JSON 호환 문자열에서 JSON.parse ()로 생성 된 객체 사이에는 차이가 없습니다.

  • 모든 변환에 사용되는 JSON 객체는 하나뿐입니다.

질문으로 돌아 가기 :

  • Q1 : 작은 리터럴을 사용하여 객체 리터럴을 사용할 수 있습니다. 따옴표는 속성 이름에 선택적으로 사용되며 문자열 값에는 필수입니다. 객체 리터럴 자체는 따옴표로 묶지 않습니다.

  • Q2 : 리터럴에서 생성되고 JSON.parse ()를 사용하는 객체는 완전히 동일합니다. 이 두 객체는 ​​생성 후 동일합니다.

    var obj1 = { one: 1, "two": 2, "three": 3 };
    var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');

  • Q3 : 최신 브라우저 JSON.parse()에서는 JSON 호환 문자열에서 JS 객체를 만드는 데 사용됩니다. (jQuery에는 모든 브라우저에서 사용할 수있는 동등한 방법이 있습니다).


7

Q1-JS에서는 키가 예약어이거나 불법 토큰 인 경우 따옴표 만 사용하면됩니다. JSON에서는 항상 키 이름에 큰 따옴표를 사용해야합니다.

Q2- 입력 객체 jsonString직렬화 된 버전입니다 ...

Q3-다음을 사용하여 동일한 모양의 객체 로 직렬화 해제 할 수 있습니다.JSON.parse()


1

질문에 이미 좋은 답변이 게시되어 있습니다. 아래에 작은 예를 추가하여 이전 답변에서 제공된 설명을보다 쉽게 ​​이해할 수 있습니다. 더 나은 이해를 위해 스 니펫 아래의 붙여 넣기를 IDE에 복사하고 invalid_javascript_object_no_quotes컴파일 시간 오류를 피하기 위해 객체 선언이 포함 된 행을 주석 처리하십시오 .

// Valid JSON strings(Observe quotes)
valid_json = '{"key":"value"}'
valid_json_2 = '{"key 1":"value 1"}' // Observe the space(special character) in key - still valid


//Valid Javascript object
valid_javascript_object_no_quotes = {
    key: "value"  //No special character in key, hence it is valid without quotes for key
}


//Valid Javascript object
valid_javascript_object_quotes = {
    key:"value",  //No special character in key, hence it is valid without quotes for key
    "key 1": "value 1" // Space (special character) present in key, therefore key must be contained in double quotes  - Valid
}



console.log(typeof valid_json) // string
console.log(typeof valid_javascript_object_no_quotes) // object
console.log(typeof valid_javascript_object_quotes) // object

//Invalid Javascript object 
invalid_javascript_object_no_quotes = {
   key 1: "value"//Space (special character) present in key, since key is not enclosed with double quotes "Invalid Javascript Object"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.