JSON과 Object Literal Notation의 차이점은 무엇입니까?


219

누군가 객체 리터럴 표기법 을 사용하여 정의 된 JavaScript 객체 와 JSON 객체 의 주요 차이점이 무엇인지 말해 줄 수 있습니까 ?

JavaScript 책에 따르면 이것은 Object Notation 을 사용하여 정의 된 객체라고 말합니다 .

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

이 경우 왜 JSON 객체가 아닙니까? 따옴표를 사용하여 정의되지 않았기 때문에?


20
"이 경우 JSON 오브젝트가 아닌 이유는 무엇입니까?": 키는 문자열이어야하고 함수는 유효한 JSON 값이 아니기 때문입니다.
Matt

답변:


247

JSON이 실제로 무엇인지 명확하게 설명하겠습니다 . JSON은 XML, CSV 또는 YAML과 같이 텍스트 에 독립적 인 언어 독립적 인 데이터 교환 형식입니다.

데이터는 여러 가지 방법으로 저장할 수 있지만 텍스트 파일로 저장하고 컴퓨터에서 읽을 수있는 경우 일부 구조를 따라야합니다. JSON은 이러한 구조를 정의하는 많은 형식 중 하나입니다.

이러한 형식은 일반적으로 언어 독립적이므로 Java, Python, JavaScript, PHP로 처리 할 수 ​​있습니다.

반대로 JavaScript 는 프로그래밍 언어입니다. 물론 JavaScript는 데이터를 정의 / 설명하는 방법도 제공하지만 구문은 JavaScript에 따라 매우 다릅니다.

반대의 예로서, 파이썬은 tuples 라는 개념을 가지고 있으며 구문은 (x, y)입니다. JavaScript에는 이와 같은 것이 없습니다.


JSON과 JavaScript 객체 리터럴의 구문상의 차이점을 살펴 보겠습니다.

JSON에는 다음과 같은 구문 제약 조건이 있습니다.

  • 객체 문자열 이어야합니다 (즉, 큰 따옴표로 묶은 문자 시퀀스 ").
  • 값은 다음 중 하나 일 수 있습니다.
    • 숫자
    • (JSON) 객체
    • 배열
    • true
    • false
    • null
  • 중복 키 ( {"foo":"bar","foo":"baz"})는 정의되지 않은 구현 별 결과를 생성합니다. JSON 사양은 특히 의미를 정의하지 않습니다.

JavaScript에서 객체 리터럴은

  • 문자열 리터럴, 숫자 리터럴 또는 식별자 이름을 키로 사용합니다 (ES6부터 키를 계산할 수있어 또 다른 구문이 도입 됨).
  • 값은 함수 정의 및을 포함한 유효한 JavaScript 표현식 일 수 있습니다 undefined.
  • 중복 키는 정의 된 지정된 결과를 생성합니다 (느슨한 모드에서는 후자의 정의가 전자를 대체합니다. 엄격 모드에서는 오류입니다).

구문 을 보면 단지 두 가지 이유로 인해 JSON이 아닙니다.

  1. 키는 문자열 (문자)이 아닙니다. 그것들은 식별자 이름 입니다.
  2. JSON이 함수의 구문을 정의하지 않기 때문에 함수를 "JSON 객체"에 값으로 할당 할 수 없습니다.

그러나 가장 중요한 것은 처음부터 내 설명을 반복하는 것입니다. JavaScript 컨텍스트에 있습니다. JavaScript 객체를 정의합니다. "JSON 객체"는 문자열에만 포함될 수 있습니다.

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

즉, JavaScript 소스 코드를 작성하고 string을 처리하지 않으면 JSON을 처리하지 않는 것입니다. 어쩌면 데이터를 JSON으로 받았을 수도 있지만 (예를 들어, 아약스를 통해 또는 파일에서 읽음) 사용중인 라이브러리 나 라이브러리가 분석 한 후에는 더 이상 JSON이 아닙니다.


객체 리터럴과 JSON이 비슷해 보이기 때문에 서로 이름을 바꿀 수있는 것은 아닙니다. 참조 는 "JSON 개체"같은 것은 없다 .


8
또한 JSON은 떨어져 있음을 알아 하위 객체 리터럴 표기법의이
숀 킨제이

14
@SeanKinsey : 그렇지 않다 : timelessrepo.com/json-isnt-a-javascript-subset
mpen

1
일반적으로 주석이 유효한 컨텍스트에서 JavaScript 객체 리터럴을 기대할 수 있으며 JSON 사양에서는 주석을 허용하지 않습니다 ( 이 게시물 참조) .
Brian Henry

""사용 여부에 관계없이 객체 리터럴의 키는 항상 문자열입니다.
overexchange

2
@overexchange : "객체 리터럴의 키는 항상 문자열입니다." 여기 두 가지를 혼합하고 있지만 여기에 명확한 선을 그리지 않았기 때문에 당신을 비난 할 수 없습니다. 객체 리터럴 과 객체 을 구별해야 합니다 . 문자는 소스 코드에 작성하는 문자 시퀀스입니다. 값은 소스 코드를 해석하여 만들어지는 것입니다. 객체 리터럴 (구문)을 사용하면 식별자 이름 , 문자열 리터럴 또는 숫자 리터럴을 사용할 수 있습니다 . 런타임에 그것들이 모두 문자열로 변환되는 것이 맞습니다 (그러나 이제 심볼도 있습니다).
Felix Kling

41

JSON 에는 다음과 같은 훨씬 더 제한적인 구문이 있습니다.

  • 주요 가치는 인용되어야합니다
  • 문자열은 함께 인용되어야 "하지'
  • 값의 범위가 더 제한되어 있습니다 (예 : 함수가 허용되지 않음)

1
이 기능이 허용되지 않습니다.
Karan Kaw

의견도 허용되지 않습니다. 의심스러운 이유로. (그들은 몇 번의 질문을 들었다.) 이것이 내가 말하는 가장 큰 차이점이다.
user7610

15

"JSON 객체"와 같은 것은 실제로 없습니다.

JSON 사양은 데이터를 문자열로 인코딩하기위한 구문입니다. 사람들이 "JSON 객체"(javascript)라고 부르는 것은 실제로 유효한 JSON 문자열에서 역 직렬화되고 아마도 유효한 JSON 문자열로 쉽게 다시 직렬화 될 수있는 일반적인 자바 스크립트 객체 일뿐입니다. 이는 일반적으로 데이터 만 포함하고 기능은 포함하지 않음을 의미합니다. JSON에는 날짜 유형이 없기 때문에 날짜가 없다는 것을 의미합니다 (아마도 JSON에 대해 가장 고통스러운 것입니다).

또한 사람들이 "JSON Object"에 대해 이야기 할 때 (side-rant ...), 그들은 거의 항상 최상위에 "중괄호"가있는 데이터를 의미합니다. 이것은 자바 스크립트 객체와 잘 어울립니다. 그러나 JSON 사양에서는 JSON 문자열의 최상위에 단일 "중괄호"객체가 필요하지 않습니다. 최상위 수준의 목록을 갖거나 단일 값을 갖는 것도 완벽하게 유효한 JSON입니다. 따라서 모든 "JSON Object"는 유효한 JSON에 해당하지만 모든 유효한 JSON 문자열이 "JSON Object"라고하는 것과 일치하지는 않습니다! (문자열은 목록 또는 원자 값을 나타낼 수 있기 때문에)


5
답변에 오류가 있습니다 . 최상위 수준에서 원자 값을 갖는 것은 유효하지 않습니다 . JSON은 상단이 객체 또는 배열이 될 수 있지만 다른 것은 아닙니다. 표준 인 RFC4627 은 JSON 문법을로 설명 JSON-text = object / array합니다.
Rory O'Kane

9

에 따르면 자바 스크립트에서 JSON ,

JSON은 JavaScript의 객체 리터럴 표기법의 하위 집합 입니다.

즉, 유효한 JSON은 유효한 JavaScript 객체 리터럴 표기법이지만 반드시 다른 방법 일 필요는 없습니다.

@Filix King이 제안한 것처럼 설명서 를 읽는 것 외에도 JSONLint 온라인 JSON 유효성 검사기를 사용하는 것이 좋습니다 . 그것이 JSON 객체의 키가 문자열이어야한다는 것을 알게 된 방법입니다.


2
주목할 점 : 정확한 부분 집합아니며 JS 객체 리터럴로 유효하지 않은 일부 JSON 문자열이 있습니다
Bergi

5

🔫 JSON : XML에 대한 뚱뚱한 대안

JSON은 분산 응용 프로그램 및 서비스를 훨씬 쉽게 제작할 수 있다는 것을 알게 된 사람들에 의해 널리 채택되었습니다. JSON의 공식 인터넷 미디어 유형은 application/json RFC 4627입니다. JSON 파일 이름은 확장자를 사용합니다 .json.


► JavaScript Object Notation ( JSON)은 텍스트 기반의 언어 독립적 인 경량 데이터 교환 형식입니다. JSON은 프로그래밍 언어로 작성된 응용 프로그램간에 데이터를 교환하는 데 사용되었습니다.

JSON 객체는 JSON 텍스트를 구문 분석하고 구성하는 데 사용되는 구문 분석 및 문자열 화의 두 가지 함수를 포함하는 단일 객체입니다.

  • JSON.stringify는 다음 JSON 문법을 따르는 문자열을 생성합니다.
  • JSON.parse는 JSON 문법을 따르는 문자열을 허용합니다.

parseJSON 메소드가에 포함됩니다 Fourth Edition of ECMAScript. 그 동안 json.org에서 JavaScript 구현을 사용할 수 있습니다.

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSON은 JavaScript의 하위 집합입니다. Javascript 는 ECMAScript Programming Language Standard에서 파생되었습니다.


► ECMAScript

ECMAScript는 세계에서 가장 널리 사용되는 범용 프로그래밍 언어 중 하나로 성장했습니다. 웹 브라우저에 내장 된 언어로 가장 잘 알려져 있지만 서버 및 내장 응용 프로그램에도 널리 채택되었습니다. ECMAScript는 가장 잘 알려진 JavaScript(Netscape Communications) 및 JScript(Microsoft Corporation) 몇 가지 원천 기술을 기반으로 합니다. 1994 년 이전에 ECMA는 "유럽 컴퓨터 제조업체 협회"로 알려졌지만, 1994 년 이후 조직이 세계화되면서 "상표" "Ecma"는 역사적 이유로 유지되었습니다.

ECMAScript는 언어 인 반면 JavaScript, JScript 및 ActionScript는이라고 "Dialects"합니다.

방언은 같은 언어에서 파생되었습니다. 그들은 같은 언어에서 파생되었지만 약간의 변화가 있었기 때문에 서로 매우 유사합니다. 방언은 언어 자체의 변형입니다. 단일 언어에서 파생됩니다.

  • SQL 언어-일부 변경되거나 추가 된 기능이있는 Hibernate MySQL Dialect, Oracle Dialect ..

사용자의 브라우저 및 컴퓨터에 대한 정보

navigator.appName // "Netscape"

ECMAScript는 JavaScript의 기초를 형성하는 스크립팅 언어입니다. .JavaScript language resources

ECMA-262 Links
Initial Edition, June 1997 PDF.
2nd Edition, August 1998 PDF.
3rd Edition, December 1999 PDF.
5th Edition, December 2009 PDF.
5.1 Edition, June 2011 HTML.
6th Edition, June 2015 HTML.
7ᵗʰ Edition, June 2016 HTML.
8th edition, June 2017 HTML.
9th Edition, 2018 HTML.

참고« 작업이 완료 되지 않아 ECMAScript 4 판이 출판되지 않았습니다 .


JSON은 구조화 된 데이터의 이식 가능한 표현을위한 작은 형식 규칙 세트를 정의합니다.

  1. ► 키 값은 따옴표로 묶어야하며 키에는 문자열 만 허용됩니다. String 이외의 다른 문자열을 사용하면 String으로 변환됩니다. 그러나 String 이외의 키는 사용하지 않는 것이 좋습니다. 이 같은 예를 확인 - { 'key':'val' }이상RFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
    
  2. ► JSON 문자열은 '가 아닌'로 인용해야합니다. 문자열은 C 또는 Java 문자열과 매우 유사합니다. 문자열은 큰 따옴표로 묶어야합니다.

    • 리터럴은 변수가 아니라 고정 된 값으로 문자 그대로 스크립트에 제공합니다.
    • 문자열은 대부분의 프로그래밍 언어에서 사용되는 것과 같은 표기법으로 백 슬래시 이스케이프먼트로 따옴표로 묶인 0 개 이상의 문자 시퀀스입니다.
      • 🔫-특수 기호는 문자열에 허용되지만 사용을 권장하지는 않습니다.
      • \ "-특수 문자를 이스케이프 할 수 있습니다. 그러나 작은 따옴표 ( ')를 이스케이프 처리하지 않는 것이 좋습니다. 엄격 모드에서는 던지고 오류가 발생합니다. SyntaxError: Unexpected token ' in JSON

    { "Hai\" \n Team 🔫":5, "Bye \'": 7 }온라인 JSON Edtions 에서이 코드 를 확인하십시오 .ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}
    

객체 속성 접근자는 점 표기법 또는 대괄호 표기법을 사용하여 객체의 속성에 액세스 할 수 있습니다.

  1. ► 값 범위가 더 제한적입니다 (예 : 기능 허용 안 함). 값은 큰 따옴표, 숫자, 부울, 널, 오브젝트 또는 배열의 문자열 일 수 있습니다. 이러한 구조는 중첩 될 수 있습니다.

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}
    

여기에 이미지 설명을 입력하십시오


JavaScript는 ECMAScript 표준의 가장 보편적 인 구현입니다. Javascript의 핵심 기능은 ECMAScript 표준을 기반으로하지만 Javascript에는 ECMA 사양 / 표준에없는 다른 추가 기능도 있습니다. 모든 브라우저에는 JavaScript 인터프리터가 있습니다.

JavaScript는 동적으로 입력되는 언어입니다. 즉, 변수를 선언 할 때 변수의 데이터 유형을 지정할 필요가 없으며 스크립트 실행 중에 데이터 유형이 필요에 따라 자동으로 변환됩니다.

Literals :

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

객체 구조는 0 개 이상의 이름 / 값 쌍 (또는 멤버)을 둘러싸는 중괄호 쌍으로 표시됩니다. 이름은 문자열입니다. 각 이름 뒤에 단일 콜론이 나타나 이름과 값을 구분합니다. 단일 쉼표는 다음 이름과 값을 구분합니다. 객체 내 이름은 고유해야합니다.

ECMAScript는 프로토 타입 기반 상속을 지원합니다. 모든 생성자에는 관련 프로토 타입이 있으며 해당 생성자에 의해 작성된 모든 오브젝트에는 해당 생성자와 연관된 프로토 타입 (오브젝트의 프로토 타입이라고 함)에 대한 암시 적 참조가 있습니다. 또한 프로토 타입에는 프로토 타입에 대한 널이 아닌 암시 적 참조가있을 수 있습니다. 이것을 프로토 타입 체인이라고합니다.

클래스 기반 객체 지향 언어에서 일반적으로 상태는 인스턴스에 의해 전달되고 메서드는 클래스에 의해 전달되며 상속은 구조와 동작에 지나지 않습니다. ECMAScript에서 상태와 메소드는 객체에 의해 전달되며 구조, 동작 및 상태는 모두 상속됩니다.

프로토 타입은 ECMAScript에서 구조, 상태 및 동작 상속을 구현하는 데 사용되는 객체입니다. 생성자가 객체를 만들면 해당 객체는 속성 참조를 확인하기 위해 생성자의 관련 프로토 타입을 암시 적으로 참조합니다. 생성자의 관련 프로토 타입은 프로그램 표현식 constructor.prototype으로 참조 할 수 있으며, 프로토 타입을 공유하는 모든 객체는 상속을 통해 객체의 프로토 타입에 추가 된 속성을 공유합니다.


2

RFC가 블로그 및 의견 기반 오해보다 여전히 중요하다고 생각하는 사람들을 위해 몇 가지 요점을 명확하게 설명해 보겠습니다. 이전 답변에서 이미 언급 한 모든 정확한 차이점을 반복하지는 않겠습니다. 여기서 중요한 부분 rfc7159를 요약하는 가치를 추가하려고합니다.

https://tools.ietf.org/html/rfc7159 에서 추출

  1. JSON ( JavaScript Object Notation)은 구조화 된 데이터의 직렬화를위한 텍스트 형식입니다. ECMAScript Programming Language Standard, Third Edition [ECMA-262]에 정의 된 JavaScript 의 객체 리터럴 에서 파생됩니다 .
  2. JSON은 4 가지 기본 유형 (문자열, 숫자, 부울 및 널)과 2 개의 구조화 된 유형 ( 객체 및 배열)을 나타낼 수 있습니다 .
  3. 객체 이름 문자열 인 0 개 이상의 이름 / 값 쌍의 컬렉션을 순서화하고 값은 문자열, 숫자, 부울 널이다 오브젝트 또는 어레이.
  4. begin-object = ws % x7B ws; {왼쪽 중괄호
  5. 최종 객체 = ws % x7D ws; } 오른쪽 중괄호
  6. JSON 값은 object , 배열, 숫자 또는 문자열이거나 다음 세 가지 리터럴 이름 중 하나 여야합니다 . false null true
  7. 오브젝트 구조 중괄호 쌍으로 표현되는
  8. 객체 내 이름은 고유해야합니다. object = begin-object [멤버 * (값 구분자 멤버)] end-object
  9. 객체 이름이 모두 고유은받는 모든 소프트웨어 구현한다는 점에서 상호 운용 오브젝트가 이름 값의 매핑에 동의 할 것이다. 내 이름 때 개체가 고유하지 않은, 이러한 수신 소프트웨어의 동작 목적은 예측할 수 없다.
  10. 예 (RFC의 12 페이지부터)

    이것은 JSON 객체입니다.

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }

    그 이미지는 부재 인 객체 그 섬네일 가능 부재 인 오브젝트 ID가 부재 번호의 배열이며.

"JSON 객체"와 같은 것은 실제로 없습니다.

정말?


1
다비, 그것은 아니다 Object그것은이다, String. 감사합니다
abu abu

1

내가 이해하는 한 가장 큰 차이점은 유연성 입니다.

JSON은 "JavaScript 객체 표기법"의 일종의 래퍼로, 사용자는 객체를 정의하기 위해보다 엄격한 규칙을 준수해야합니다. 그리고 JavaScript Object Notation 기능이 제공하는 가능한 객체 선언 방법을 제한하여이를 수행합니다.

결과적으로 플랫폼 간 데이터 교환에 더 적합한 더 단순하고 표준화 된 객체가 있습니다.

기본적으로 위의 예제에서 newObject는 JavaScript Objeect Notation을 사용하여 정의 된 객체입니다. 그러나 JSON 표준에 필요한 규칙을 따르지 않기 때문에 '유효한'JSON 객체가 아닙니다.

이 링크는 또한 매우 유용합니다 : http://msdn.microsoft.com/en-us/library/bb299886.aspx


2
JSON과 객체 표기법의 목적은 완전히 다릅니다. 첫 번째는 데이터 교환에만 사용되고 두 번째는 내부 용으로 만 JS 객체를 만드는 것입니다. 그들은 같은 것의 엄격한 버전이 아닙니다.
ilyo

0

먼저 JSON이 무엇인지 알아야합니다.

언어에 구애받지 않는 데이터 교환 형식입니다. JSON의 구문은 JavaScript Object Literal 표기법에서 영감을 얻었지만 차이점이 있습니다.

예를 들어 JSON에서는 모든 키를 따옴표로 묶어야하지만 객체 리터럴에서는 필요하지 않습니다.

// JSON : { "foo": "bar"}

// 객체 리터럴 : var o = {foo : "bar"}; JavaScript (ECMAScript 3 판)에서 예약 이름을 속성 이름으로 사용하는 것이 허용되지 않기 때문에 따옴표는 JSON에서 필수입니다.

var o = {if : "foo"}; // ES3의 SyntaxError 문자열 리터럴을 속성 이름 (속성 이름을 인용)으로 사용하면 문제가 발생하지 않습니다.

var o = { "if": "foo"}; 따라서 "호환성"(그리고 쉬운 평가일까요?)의 경우 인용문은 필수입니다.

JSON의 데이터 유형도 다음 값으로 제한됩니다.

문자열 번호 객체 배열 리터럴 : true false null 문자열 문법이 변경됩니다. 큰 따옴표로 묶어야하지만 JavaScript에서는 작은 따옴표 나 큰 따옴표를 서로 바꿔 사용할 수 있습니다.

// 유효하지 않은 JSON : { "foo": 'bar'} 허용되는 숫자의 JSON 문법도 변경됩니다. JavaScript에서는 16 진수 리터럴 (예 : 0xFF) 또는 (유명한) 8 진수 리터럴 (예 : 010)을 사용할 수 있습니다. JSON에서는 다음을 사용할 수 있습니다. 십진 리터럴 만.

// 유효하지 않은 JSON : { "foo": 0xFF}


0

자바 스크립트 객체 리터럴과 JSON :

  • 객체 리터럴 구문은 자바 스크립트 객체를 생성하는 매우 편리한 방법입니다.
  • JSON'자바 스크립트 객체 표기법'의 약자 언어, 자바 스크립트 객체 리터럴 구문에서 파생 된 구문이 있습니다. 프로그래밍 언어 독립적 인 텍스트 데이터 전송 형식으로 사용됩니다.

예:

코드에서 편리하게 객체를 생성하기 위해 JS에서 사용되는 JS 객체 표기법 :

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

JSON의 예 :

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

주요 차이점 :

  • JSON의 모든 객체 키는 문자열이어야합니다. Javascript에서 객체 키는 문자열 또는 숫자 일 수 있습니다.

  • JSON의 모든 문자열은 "큰 따옴표"로 인용해야합니다. Javascript에서는 작은 따옴표와 큰 따옴표가 모두 허용됩니다. Javascript 객체 표기법에 따옴표가 없더라도 객체 키는 암시 적으로 문자열로 캐스트됩니다.

  • JSON에서는 함수가 객체의 값으로 정의 될 수 없습니다 (이것은 Javascript 특정이므로). Javascript에서 이것은 완전히 합법적입니다.

JSON객체의 자바 스크립트 빌드 :

JSONJSONJavascript가 런타임에 제공 하는 내장 객체를 사용하여 객체를 Javascript 로 쉽게 변환하거나 그 반대로 변환 할 수 있습니다 . 예를 들면 다음과 같습니다.

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object


0

놀라운 차이점은 다음과 같습니다. undefinedjson에서 사용할 수 없으며 정의되지 않은 값을 가진 모든 객체 필드가 ​​사라집니다.JSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

🙈🙉🙊

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.