누군가 객체 리터럴 표기법 을 사용하여 정의 된 JavaScript 객체 와 JSON 객체 의 주요 차이점이 무엇인지 말해 줄 수 있습니까 ?
JavaScript 책에 따르면 이것은 Object Notation 을 사용하여 정의 된 객체라고 말합니다 .
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
이 경우 왜 JSON 객체가 아닙니까? 따옴표를 사용하여 정의되지 않았기 때문에?
답변
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이 아닙니다.
- 키는 문자열 (문자)이 아닙니다. 그것들은 식별자 이름 입니다.
- 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 개체”같은 것은 없다 .
답변
JSON 에는 다음과 같은 훨씬 더 제한적인 구문이 있습니다.
- 주요 가치는 인용되어야합니다
- 문자열은 함께 인용되어야
"
하지'
- 값의 범위가 더 제한되어 있습니다 (예 : 함수가 허용되지 않음)
답변
“JSON 객체”와 같은 것은 실제로 없습니다.
JSON 사양은 데이터를 문자열로 인코딩하기위한 구문입니다. 사람들이 “JSON 객체”(javascript)라고 부르는 것은 실제로 유효한 JSON 문자열에서 역 직렬화되고 아마도 유효한 JSON 문자열로 쉽게 다시 직렬화 될 수있는 일반적인 자바 스크립트 객체 일뿐입니다. 이는 일반적으로 데이터 만 포함하고 기능은 포함하지 않음을 의미합니다. JSON에는 날짜 유형이 없기 때문에 날짜가 없다는 것을 의미합니다 (아마도 JSON에 대해 가장 고통스러운 것입니다).
또한 사람들이 “JSON Object”에 대해 이야기 할 때 (side-rant …), 그들은 거의 항상 최상위에 “중괄호”가있는 데이터를 의미합니다. 이것은 자바 스크립트 객체와 잘 어울립니다. 그러나 JSON 사양에서는 JSON 문자열의 최상위에 단일 “중괄호”객체가 필요하지 않습니다. 최상위 수준의 목록을 갖거나 단일 값을 갖는 것도 완벽하게 유효한 JSON입니다. 따라서 모든 “JSON Object”는 유효한 JSON에 해당하지만 모든 유효한 JSON 문자열이 “JSON Object”라고하는 것과 일치하지는 않습니다! (문자열은 목록 또는 원자 값을 나타낼 수 있기 때문에)
답변
에 따르면 자바 스크립트에서 JSON ,
JSON은 JavaScript의 객체 리터럴 표기법의 하위 집합 입니다.
즉, 유효한 JSON은 유효한 JavaScript 객체 리터럴 표기법이지만 반드시 다른 방법 일 필요는 없습니다.
@Filix King이 제안한 것처럼 설명서 를 읽는 것 외에도 JSONLint 온라인 JSON 유효성 검사기를 사용하는 것이 좋습니다 . 그것이 JSON 객체의 키가 문자열이어야한다는 것을 알게 된 방법입니다.
답변
? 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은 구조화 된 데이터의 이식 가능한 표현을위한 작은 형식 규칙 세트를 정의합니다.
-
► 키 값은 따옴표로 묶어야하며 키에는 문자열 만 허용됩니다. 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() {}' ] );
-
► JSON 문자열은 ‘가 아닌’로 인용해야합니다. 문자열은 C 또는 Java 문자열과 매우 유사합니다. 문자열은 큰 따옴표로 묶어야합니다.
- 리터럴은 변수가 아니라 고정 된 값으로 문자 그대로 스크립트에 제공합니다.
- 문자열은 대부분의 프로그래밍 언어에서 사용되는 것과 같은 표기법으로 백 슬래시 이스케이프먼트로 따옴표로 묶인 0 개 이상의 문자 시퀀스입니다.
- ?-특수 기호는 문자열에 허용되지만 사용을 권장하지는 않습니다.
- \ “-특수 문자를 이스케이프 할 수 있습니다. 그러나 작은 따옴표 ( ‘)를 이스케이프 처리하지 않는 것이 좋습니다. 엄격 모드에서는 던지고 오류가 발생합니다.
SyntaxError: Unexpected token ' in JSON
{ "Hai\" \n Team ?":5, "Bye \'": 7 }
온라인 JSON Edtions 에서이 코드 를 확인하십시오 .Modes
notStrict
,
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"}
객체 속성 접근자는 점 표기법 또는 대괄호 표기법을 사용하여 객체의 속성에 액세스 할 수 있습니다.
-
► 값 범위가 더 제한적입니다 (예 : 기능 허용 안 함). 값은 큰 따옴표, 숫자, 부울, 널, 오브젝트 또는 배열의 문자열 일 수 있습니다. 이러한 구조는 중첩 될 수 있습니다.
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
객체 구조는 0 개 이상의 이름 / 값 쌍 (또는 멤버)을 둘러싸는 중괄호 쌍으로 표시됩니다. 이름은 문자열입니다. 각 이름 뒤에 단일 콜론이 나타나 이름과 값을 구분합니다. 단일 쉼표는 다음 이름과 값을 구분합니다. 객체 내 이름은 고유해야합니다.
ECMAScript는 프로토 타입 기반 상속을 지원합니다. 모든 생성자에는 관련 프로토 타입이 있으며 해당 생성자에 의해 작성된 모든 오브젝트에는 해당 생성자와 연관된 프로토 타입 (오브젝트의 프로토 타입이라고 함)에 대한 암시 적 참조가 있습니다. 또한 프로토 타입에는 프로토 타입에 대한 널이 아닌 암시 적 참조가있을 수 있습니다. 이것을 프로토 타입 체인이라고합니다.
클래스 기반 객체 지향 언어에서 일반적으로 상태는 인스턴스에 의해 전달되고 메서드는 클래스에 의해 전달되며 상속은 구조와 동작에 지나지 않습니다. ECMAScript에서 상태와 메소드는 객체에 의해 전달되며 구조, 동작 및 상태는 모두 상속됩니다.
프로토 타입은 ECMAScript에서 구조, 상태 및 동작 상속을 구현하는 데 사용되는 객체입니다. 생성자가 객체를 만들면 해당 객체는 속성 참조를 확인하기 위해 생성자의 관련 프로토 타입을 암시 적으로 참조합니다. 생성자의 관련 프로토 타입은 프로그램 표현식 constructor.prototype으로 참조 할 수 있으며, 프로토 타입을 공유하는 모든 객체는 상속을 통해 객체의 프로토 타입에 추가 된 속성을 공유합니다.
답변
RFC가 블로그 및 의견 기반 오해보다 여전히 중요하다고 생각하는 사람들을 위해 몇 가지 요점을 명확하게 설명해 보겠습니다. 이전 답변에서 이미 언급 한 모든 정확한 차이점을 반복하지는 않겠습니다. 여기서 중요한 부분 rfc7159를 요약하는 가치를 추가하려고합니다.
https://tools.ietf.org/html/rfc7159 에서 추출
- JSON ( JavaScript Object Notation)은 구조화 된 데이터의 직렬화를위한 텍스트 형식입니다.
ECMAScript Programming Language Standard, Third Edition [ECMA-262]에 정의 된 JavaScript 의 객체 리터럴 에서 파생됩니다 . - JSON은 4 가지 기본 유형 (문자열, 숫자, 부울 및 널)과 2 개의 구조화 된 유형 ( 객체 및 배열)을 나타낼 수 있습니다 .
- 객체 이름 문자열 인 0 개 이상의 이름 / 값 쌍의 컬렉션을 순서화하고 값은 문자열, 숫자, 부울 널이다 오브젝트 또는 어레이.
- begin-object = ws % x7B ws; {왼쪽 중괄호
- 최종 객체 = ws % x7D ws; } 오른쪽 중괄호
- JSON 값은 object , 배열, 숫자 또는 문자열이거나 다음 세 가지 리터럴 이름 중 하나 여야합니다 . false null true
- 오브젝트 구조 중괄호 쌍으로 표현되는
- 객체 내 이름은 고유해야합니다.
object = begin-object [멤버 * (값 구분자 멤버)]
end-object - 객체 이름이 모두 고유은받는 모든 소프트웨어 구현한다는 점에서 상호 운용 오브젝트가 이름 값의 매핑에 동의 할 것이다. 내 이름 때 개체가 고유하지 않은, 이러한 수신 소프트웨어의 동작 목적은 예측할 수 없다.
-
예 (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 객체”와 같은 것은 실제로 없습니다.
정말?
답변
내가 이해하는 한 가장 큰 차이점은 유연성 입니다.
JSON은 “JavaScript 객체 표기법”의 일종의 래퍼로, 사용자는 객체를 정의하기 위해보다 엄격한 규칙을 준수해야합니다. 그리고 JavaScript Object Notation 기능이 제공하는 가능한 객체 선언 방법을 제한하여이를 수행합니다.
결과적으로 플랫폼 간 데이터 교환에 더 적합한 더 단순하고 표준화 된 객체가 있습니다.
기본적으로 위의 예제에서 newObject는 JavaScript Objeect Notation을 사용하여 정의 된 객체입니다. 그러나 JSON 표준에 필요한 규칙을 따르지 않기 때문에 ‘유효한’JSON 객체가 아닙니다.
이 링크는 또한 매우 유용합니다 :
http://msdn.microsoft.com/en-us/library/bb299886.aspx