즐거움과 이윤을 얻기 위해 JSON 확장

12725 단어 javascript
제목 이미지: Steel's Fudge
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);
대상 구조를 깊이 연구하면 대상의 MapDrone 속성이 memberOfdrone 의 실제 실례를 발견할 수 있습니다!

끝내다


위의 예제에서는 Set API에 내장된 해석 및 정렬화된 파이핑에 대해 더 잘 알 수 있기를 바랍니다.클래스 실례 (또는 클래스 실례로 다시 수합) 에 수합이 필요한 데이터 대상의 데이터 구조를 처리할 때마다, 이것은 변환을 처리하기 위해 자신의 귀속이나 맞춤형 함수를 작성하지 않고 양방향으로 비추는 방법을 제공합니다.
즐거운 인코딩!

좋은 웹페이지 즐겨찾기