gpt4 book ai didi

json - 规范化 JSON API 标准 v1

转载 作者:行者123 更新时间:2023-12-04 23:18:36 25 4
gpt4 key购买 nike

我一直在调查normalizr用于扁平化 standard JSON API format 格式的 JSON API 数据.任何人都可以指出我正在完成的一些例子吗?我特别关注如何处理资源对象关系的 normalizr 模式(由 JSON API 标准定义)。在 JSON API 标准中,资源对象中定义了一个“关系”属性,然后是每组相关对象的属性。以下是 JSON API 格式的单个产品类别与两个相关产品的示例:

{
"jsonapi": {
"version": "1.0"
},
"meta": {
"time": "0.006"
},
"data": [
{
"type": "category",
"id": "6",
"attributes": {
"name": "Odwalla"
},
"meta": {
"product_count": "0"
},
"relationships": {
"product": {
"data": [
{
"type": "product",
"id": "4785"
},
{
"type": "product",
"id": "4786"
}
]
}
}
}
],
"included": [
{
"type": "product",
"id": "4786",
"attributes": {
"name": "Strawberry & Banana Odwalla",
"description": null,
"price": "3.19",
"upc": ""
}
},
{
"type": "product",
"id": "4785",
"attributes": {
"name": "Blueberry Odwalla",
"description": null,
"price": "3.19",
"upc": ""
}
}
]
}

该类别中包含的产品列在 data.relationships.product.data 下,这些产品对象包含在所包含的数组中。我相信有很多方法可以使这一点正常化;对于 Flux/Redux 商店来说,最有效和最友好的方法是什么?

最佳答案

据我了解 json:api 提供规范化数据。相关数据不直接与主要资源嵌套,而是 included — 看到这个 Compound DocumentsFetching Includes . normalizr 并不适用于这种数据结构,但如果这是您的意图,您可以轻松构建一些可以为您提供与 normalizr 相同的结果的东西。由于 json:api 是一个非常严格的标准,因此非常适合使用。这就是我尝试实现这一目标的方式,从 normalizr 库中获得了很多“灵感”……

import { reduce, append } from 'ramda'

export default function normalize({data, included}) {
let bag = {}
const result = visit(data, bag)
visit(included, bag)

return {
entities: bag,
result
}
}

function visitIterable(obj, bag) {
return reduce((acc, item) => {
const entityId = visitEntity(item, bag)
return append(entityId, acc)
}, [], obj)
}

function visitEntity(obj, bag) {
const entityKey = obj.type
const entityId = obj.id

if (!bag.hasOwnProperty(entityKey)) {
bag[entityKey] = {}
}

bag[entityKey][entityId] = obj
return entityId
}

function visit(obj, bag) {
if (Array.isArray(obj)) {
return {
list: visitIterable(obj, bag)
}
} else if (typeof obj === 'object') {
return {
item: visitEntity(obj, bag)
}
}
}

关于json - 规范化 JSON API 标准 v1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com