2016-07-01 5 views
8

표준을 통해 키가 중첩 된 표준화 된 JSON API 응답을 처리하려면 어떻게 normalizr을 사용할 수 있습니까? A는 BookRedux normalizr - 중첩 된 API 응답

{ 
    data: { 
     title: 'Lord of the Rings', 
     pages: 9250, 
     publisher: { 
      data: { 
       name: 'HarperCollins LLC', 
       address: 'Big building next to the river', 
       city: 'Amsterdam' 
      }, 
     }, 
     author: { 
      data: { 
       name: 'J.R.R Tolkien', 
       country: 'UK', 
       age: 124, 
      } 
     } 
    } 
} 

어떻게 중첩 된 데이터 키를 다루는 스키마를 설계하는 것입니다 예를 들어

?

+0

json으로 (http://jsonapi.org/format/을 :)에 대해 좀 더 설명 도움이되기를 바랍니다, 환상적입니다 # 문서 - 최상위 수준). 빨리, 메인 리소스에 다른 리소스를 중첩시킬 수는 없지만 페이로드에 다른 리소스를 포함 시키려면 특정 키 ['include'] (http://jsonapi.org/format/#fetching-includes)를 사용해야합니다. . 주요 리소스에서 키 '관계'아래에서 자신과 다른 리소스 간의 관계에 대해 [제한된 정보 집합] (http://jsonapi.org/format/#document-resource-object-relationships) 만 보낼 수 있습니다. – NickGnd

+0

귀하의 권리, 나는 질문을 업데이 트합니다 – AndrewMcLagan

답변

3

normalize의 옵션으로 전달할 수있는 assignEntity 기능을 사용하는 것으로 알고 있습니다. 이 경우 적절한 경우 중복 된 data 속성을 필터링하고 바로 아래의 값으로 이동합니다.

효과적으로 assignEntity 데이터의 각 키가 정규화되는 방식을 제어합시다. 어떻게 작동하는지 좀 더 알아 보려면 here을보십시오.

데모로 데모를 함께 작성했습니다.보세요 : http://requirebin.com/?gist=b7d89679202a202d72c7eee24f5408b6. 여기 단편이다 :

book.define({ 
    data: { 
    publisher: publisher, 
    author: author, 
    characters: normalizr.arrayOf(character) 
    }} 
); 

publisher.define({ 
    data: { 
    country: country 
    } 
}); 

const result = normalizr.normalize(response, book, { assignEntity: function (output, key, value, input) { 
    if (key === 'data') { 
    Object.keys(value).forEach(function(d){ 
     output[d] = value[d]; 
    }) 
    } else { 
    output[key] = value; 
    } 
}}); 

참조 characters 배열없이 data 일부 중첩 정보 일부 개체가 특정 LN 29 인치 모두 정상적으로 표준화되었습니다.

또한 배열 및 심하게 중첩 된 데이터와 함께 작동하는 방법을 보여주기 위해 일부 부품을 추가했습니다. 모델 publisher을 참조하십시오.

제공된 데이터를 사용하면 id가 없기 때문에 슬러그가 필요합니다. 각 스키마에는 예제에 포함되어 있습니다.

Normalizr 내가 그게 당신이 [`JSONAPI` 사양]을 따르지 않는 게시

+0

멋진 답변, 멋진 예! – AndrewMcLagan

+0

감사! 어떤 부분이 더 자세한 설명의 이점을 누릴 수 있다고 생각한다면 알려주세요 :) – horyd

+0

적절한 JSON-API 응답으로 질문을 업데이트 할 것입니다. – AndrewMcLagan

6

응답의 각 엔터티에 대해 자체 스키마를 만들어야합니다. 일부 기업 정상화해야한다, 우리는이 방법은 객체를 받아 schema.This의 define 방법을 사용할 필요가 중첩 된 데이터가있는 경우

// schemas.js 
import { Schema } from 'normalizr'; 

const bookSchema = new Schema('book'); 
const publisherSchema = new Schema('publisher'); 
const authorSchema = new Schema('author'); 

: books, authorspublishers - 당신의 예에서

, 우리는 세 가지 요소를 가지고 중첩 규칙이 있습니다. 우리의 응답

// schemas.js 
bookSchema.define({ 
    data: { 
    publisher: publisherSchema, 
    author: authorSchema 
    } 
}); 

이제 우리 정상화 할 수 있습니다 :

import { normalize } from 'normalizr'; 
import { bookSchema } from './schemas.js'; 

const response = { 
    data: { 
     title: 'Lord of the Rings', 
     pages: 9250, 
     publisher: { 
      data: { 
       name: 'HarperCollins LLC', 
       address: 'Big building next to the river', 
       city: 'Amsterdam' 
      }, 
     }, 
     author: { 
      data: { 
       name: 'J.R.R Tolkien', 
       country: 'UK', 
       age: 124, 
      } 
     } 
    } 
} 

const data = normalize(response, bookSchema); 
을 우리가 book 기업의 publisherauthor 소품을 정상화해야하는 경우

, 우리는 우리의 응답으로 동일한 구조를 가진 define 함수에 개체를 전달한다
+0

좋아, 당신이 정교 할 수 있다면. 훌륭해. 커뮤니티의 나머지 부분에 대해 잘 설명 된 답변을 원합니다. – AndrewMcLagan

+0

@AndrewMcLagan 문제 없음 :) 업데이트 된 답변. – 1ven

+0

루트 응답 객체 인 경우 (위와 같이),이 경우'book'도'{data}'로 중첩됩니까? – AndrewMcLagan