즐거움과 이윤을 얻기 위해 JSON 확장
12725 단어 javascript
JavaScript 초기에 비동기 요청이 처음으로 웹 작성자가 HTTP 서버에 요청을 보내고 읽을 수 있는 응답을 받을 수 있도록 할 때 모든 사람들은 XML을 데이터 교환의 표준으로 사용했다.이 문제는 통상적으로 해석한다.서버와 안전하게 통신할 수 있도록 강력한 해상도와 서열화 프로그램이 있어야 합니다.
Douglas Crockford가 자바스크립트 언어의 정적 서브집합으로 도입되면서 문자열, 숫자, 그룹만 값으로 허용하고 대상은 키와 값 집합으로 간소화됩니다.이 형식은 보안을 제공하는 동시에 건장성을 가지게 합니다. JSON 와 달리 실행 가능한 코드를 정의할 수 없기 때문입니다.
웹 작성자는 그것을 좋아하고 (인용 필요) API 개발자는 흔쾌히 받아들였다. 곧 표준화는
JSON
API를 웹 표준에 도입했다.JSONP 회사 JSON 분석
parse
방법은 JSON
값을 나타내는 문자열과 선택할 수 있는 reviver
함수 두 가지 매개 변수만 받아들인다.해석할 때 첫 번째 매개변수만 사용하여 함수를 해석할 수 있습니다.
const json={“hello”:“world”};
상수치해석(json);
그런데 이
reviver
논점은 도대체 무엇을 한 것일까?에 따르면
reviver
는 함수로서 해석 기간에 모든 키와 값을 전달하고 이 키의 교체 값을 되돌려 줄 것으로 예상된다.이렇게 하면 객체의 인스턴스와 같은 다른 값으로 값을 바꿀 수 있습니다.이 점을 설명하기 위해 예시를 하나 만듭니다.연결할 드론 팀이 있다고 가정하면 API는 각 드론에 일련의 구성 대상을 제공합니다.클래스
Drone
부터 시작합니다.상수 이름 = 기호 ("이름"),
const _config = 기호("config"),
클래스 무인기 {
구조 함수(이름, 구성) {
대상속성 정의(
이것
{
[\u name]:{value:name,configurable:false,enumerable:false},
[\u config]:{value:config,configurable:false,enumerable:false}
}
);
}
이름 가져오기 () {
[_name]으로 돌아가기;
}
}
const d=새 무인기('조지 무인기', {id:1});
간단하게 말하자면, 이 종류는 단지
name
속성을 제공할 뿐이다.정의된 기호는 일반 소비자에게 개인 구성원을 숨기기 위한 것이다.공장 함수를 만들어서 설정을 실제 대상으로 바꿀 수 있는지 봅시다.우리가 생각하는 API 서버는 다음 JSON 객체를 사용하여 응답합니다.
[
{ "$type": "Drone", "args": ["George Droney", { "id": "1" } ] },
{ "$type": "Drone", "args": ["Kleintank", { "id": "2" } ] }
]
우리는 매개 변수를 적당한 대상 유형의 구조 함수에 전달함으로써 $type
속성을 가진 모든 항목을 실례로 바꾸기를 희망한다.우리는 결과가 다음과 같기를 바란다.const drones = [
new Drone('George Droney', { id: '1' }),
new Drone('Kleintank', { id: '2' })
]
따라서 reviver
속성과 같은 $type
속성을 포함하는 값을 찾아 대상 실례를 되돌려줍니다.상수 이름 = 기호 ("이름"),
const _config = 기호("config"),
클래스 무인기 {
구조 함수(이름, 구성) {
대상속성 정의(
이것
{
[\u name]:{value:name,configurable:false,enumerable:false},
[\u config]:{value:config,configurable:false,enumerable:false}
}
);
}
이름 가져오기 () {
[_name]으로 돌아가기;
}
}
상수 jsonData=[
'[',
“{“$type”:“Drone”,“args”:[“George Droney”,{“id”:“1”}]},
“{“$type”:“Drone”,“args”:[“Kleintank”,{“id”:“2”}]},
']'
].연결('\n');
상수 복구기 = (키, 값) = > {
스위치 ($유형 값) {
사례 "드론": {
새 무인기(...value.args)로 돌아가기;
}
기본값: {
값을 반환합니다.
}
}
};
콘스트 무인기 제이슨.parse(jsonData,reviver);
"Drone"
함수의 장점은 해석할 때 값이 아무리 깊어도 JSON 대상의 모든 키에 호출된다는 것이다.이것은 서로 다른 형태의 전송 JSON 데이터에서 동일한 reviver
을 실행할 수 있으며, 특정한 대상의 형상을 인코딩할 필요가 없다.MDN 회사 reviver로 서열화
때때로
JSON
에서 직접 표시할 수 없는 값이 있을 수 있지만 호환되는 값으로 변환해야 합니다.만약에 우리가
JSON
데이터를 가지고 있다면, 우리는 Set
데이터에서 사용하고 싶다.기본적으로 JSON
는 문자열과 숫자가 아닌 객체 참조를 저장하기 때문에 JSON으로 정렬할 수 없습니다.그러나 문자열 ID와 같은 정렬화된 값이 Set
개라면 Set
에서 인코딩 가능한 내용을 작성할 수 있습니다.이 예에서는 액세스할 수 있는 계정의 문자열 ID인 속성
JSON
을 포함하는 객체User
가 있다고 가정합니다.우리가 memberOfAccounts
에서 이것을 인코딩할 수 있는 방법 중 하나는 바로 수조를 사용하는 것이다.const user = {
id: '1',
memberOfAccounts: new Set(['a', 'b', 'c'])
};
우리는 Set
API의 두 번째 매개 변수
를 사용하여 이 점을 실현할 것이다.우리 전달 JSON
함수상수 사용자 ={
id:“1”,
MemberOfcounts: 새 컬렉션(['a','b','c'])
};
상수 대체 = (키, 값) = > {
if (컬렉션의 값 인스턴스) {
{$type:'Set', 매개 변수: [Array.from (value)]};
} 기타
값을 반환합니다.
}
};
const jsonData=JSON.stringify (사용자, 교체자, 2);
이렇게 해서 만약 우리가 그것을 원시 상태로 해석하고 싶다면, 우리도 상반된 방법을 응용할 수 있다.
JSON 순환 완료
그러나 역방향 맵이 유효한지 확인하기 전에,
stringify
동적일 수 있도록 방법을 확장합니다. 복원기는 전역 이름 공간을 검사해서 이름이 존재하는지 확인합니다.우리는 클래스의 이름을 얻고 클래스의 구조 함수를 되돌려 줄 수 있는 함수를 작성해야 한다.현재 범위와 열거 값을 검사할 수 없기 때문에 이 함수는 클래스를 전달해야 합니다.
const createClassLookup = (scope = new Map()) => (name) =>
scope.get(name) || (global || window)[name];
이 함수는 주어진 범위 내에서 이름을 찾은 다음 전역 이름 공간으로 돌아가서 replacer
, $type
등 내장 클래스를 해석하려고 합니다.Set
를 해석 범위에 정의하여 클래스 검색을 만듭니다.const classes = new Map([
['Drone', Drone]
]);
const getClass = createClassLookup(classes);
// we can call getClass() to resolve to a constructor now
getClass('Drone');
자, 우리 이것들을 함께 놓고 결과가 어떤지 봅시다.상수 이름 = 기호 ("이름"),
const _config = 기호("config"),
클래스 무인기 {
구조 함수(이름, 구성) {
대상속성 정의(
이것
{
[\u name]:{value:name,configurable:false,enumerable:false},
[\u config]:{value:config,configurable:false,enumerable:false}
}
);
}
이름 가져오기 () {
[_name]으로 돌아가기;
}
}
상수 사용자 ={
id:“1”,
MemberOfcounts: 새 컬렉션(['a','b','c'])
};
상수 교체 = (키, 값) = >{
if (컬렉션의 값 인스턴스) {
{$type:'Set', 매개 변수: [Array.from (value)]};
} 기타
값을 반환합니다.
}
};
const jsonData=JSON.stringify (사용자, 교체자, 2);
const createClassLookup=(scope=new Map())=>(name)=>
범위가져오기 (이름) | (전역 | 창) [이름];
상수 클래스 = 새 매핑([
["드론", 드론]
]);
const getClass=createClassLookup(클래스);
상수 복구기 = (키, 값) = > {
const Type=getClass($Type);
if(Type&&typeof Type==“function”){
새 유형 반환(...value.args);
} 기타
값을 반환합니다.
}
}
const parsedUser=JSON.parse(jsonData,reviver);
잠깐만!우리는 이미 성공적으로 해석하여 대상을 정확한 실례로 회복했습니다!동적 클래스 해석기가 더 복잡한 예제를 사용할 수 있는지 살펴보겠습니다.
const jsonData = `[
{
"id": "1",
"memberOf": { "$type": "Set", "args": [["a"]] },
"drone": { "$type": "Drone", "args": ["George Droney", { "id": "1" }] }
}
]`;
준비, 설정, 해석!상수 이름 = 기호 ("이름"),
const _config = 기호("config"),
클래스 무인기 {
구조 함수(이름, 구성) {
대상속성 정의(
이것
{
[\u name]:{value:name,configurable:false,enumerable:false},
[\u config]:{value:config,configurable:false,enumerable:false}
}
);
}
이름 가져오기 () {
[_name]으로 돌아가기;
}
}
상수 jsonData=[
'[',
' {',
“id”:“1”,
““memberOf”:{“$type”:“Set”,“args”:[[“a”]},
“drone”:{“$type”:“drone”,“args”:[“George Droney”,{“id”:“1”}]},
' }',
']'
].연결('\n');
const createClassLookup=(scope=new Map())=>(이름) = >
범위가져오기 (이름) | (전역 | 창) [이름];
상수 클래스 = 새 매핑([
["드론", 드론]
]);
const getClass=createClassLookup(클래스);
상수 복구기 = (키, 값) = > {
const Type=getClass($Type);
if(Type&&typeof Type==“function”){
새 유형 반환(...value.args);
} 기타
값을 반환합니다.
}
}
상수 데이터parse(jsonData,reviver,2);
대상 구조를 깊이 연구하면 대상의
Map
및 Drone
속성이 memberOf
및 drone
의 실제 실례를 발견할 수 있습니다!끝내다
위의 예제에서는
Set
API에 내장된 해석 및 정렬화된 파이핑에 대해 더 잘 알 수 있기를 바랍니다.클래스 실례 (또는 클래스 실례로 다시 수합) 에 수합이 필요한 데이터 대상의 데이터 구조를 처리할 때마다, 이것은 변환을 처리하기 위해 자신의 귀속이나 맞춤형 함수를 작성하지 않고 양방향으로 비추는 방법을 제공합니다.즐거운 인코딩!
Reference
이 문제에 관하여(즐거움과 이윤을 얻기 위해 JSON 확장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/krofdrakula/extending-json-for-fun-and-profit-3cg3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)