如何使用 normalizr 规范化来自 JSON 的数据?

Posted

技术标签:

【中文标题】如何使用 normalizr 规范化来自 JSON 的数据?【英文标题】:How to normalize the data from the JSON with normalizr? 【发布时间】:2021-04-14 09:09:11 【问题描述】:

我对 normalizr 很陌生,还不能很好地理解它。如何规范化以下 JSON 响应,以便将其用于 Redux:


    "statusCode":200,
    "message":"Random quotes",
    "pagination":
          "currentPage":1,
          "nextPage":null,
          "totalPages":1
        ,
    "totalQuotes":1,
    "data":[
        
          "_id":"5eb17aadb69dc744b4e70e05",
          "quoteText":"One crowded hour of glorious life is worth an age without a name.",  
          "quoteAuthor":"Walter Scott",
          "quoteGenre":"age",
          "__v":0
        
    ]

将数据对象放在标准化对象的顶层会很有用。 如何将其与 TypeScript 结合使用? 提前谢谢你。

【问题讨论】:

【参考方案1】:

Typescript 类型绝对可以帮助您理解您正在处理的数据。您想用它们自己的类型来描述响应的各个部分,然后将它们拼凑在一起。

interface Quote 
  _id: string;
  quoteText: string;
  quoteAuthor: string;
  quoteGenre: string;
  __v: number;


interface Pagination 
  currentPage: number;
  nextPage: null | number; // what is this when it's not null?
  totalPages: number;


interface APIResponse 
  statusCode: number;
  message: string;
  pagination: Pagination;
  totalQuotes: number;
  data: Quote[];

normalizr 在这里不是很有帮助,因为您只有一种实体类型,即Quote。从某种意义上说,如果您将响应本身视为一个实体,那么您有两种实体类型。但我不确定您将如何从中提取唯一 ID。您可能必须根据 API 路径/参数自己添加它,因为 JSON 中缺少该信息。

const quote = new schema.Entity("quote", ,  idAttribute: "_id" );

const response = new schema.Entity("response", 
  data: [quote] // an array of quote entities
);

console.log(normalize(...json, id: "/random-quote", response));

这给了你


  "entities": 
    "quote": 
      "5eb17aadb69dc744b4e70e05": 
        "_id": "5eb17aadb69dc744b4e70e05",
        "quoteText": "One crowded hour of glorious life is worth an age without a name.",
        "quoteAuthor": "Walter Scott",
        "quoteGenre": "age",
        "__v": 0
      
    ,
    "response": 
      "/random-quote": 
        "statusCode": 200,
        "message": "Random quotes",
        "pagination": 
           "currentPage": 1,
           "nextPage": null,
           "totalPages": 1
        ,
        "totalQuotes": 1,
        "data": ["5eb17aadb69dc744b4e70e05"],
        "id": "/random-quote"
      
    
  ,
  "result": "/random-quote"

【讨论】:

以上是关于如何使用 normalizr 规范化来自 JSON 的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 normalizr 解析 FractalTransformer

如何使用 Normalizr 定义递归模型的模式

如何在 Jbuilder 和 Normalizr 之间展平数据

如何以最平坦的方式为Redux规范化对象数组?

为啥非规范化不返回嵌套对象?

Normalizr:规范化深层嵌套项