如何规范化这种递归嵌套JSON

时间:2017-10-22 17:00:58

标签: normalization normalize normalizr

尝试规范化我的有效负载时遇到一些问题,该有效负载包含与使用Normalizr的父类型相同类型的嵌套模式

例如

{
  id: 123,
  sections:{
    section: [{
      id: 1,
      name: "test",
      sections: {
        section: {
          id: 125,
          name: "test125"
        }
      }
    }, {
      id: 2,
      name: "test2"
      sections: {
        section: [
          {
            id: 124,
            name: "test124"
          }
        ]
      }
    }, {
      id: 3,
      name: "test3"
    }]
  } 
}

在上面的json结构中,嵌套部分可以是对象或数组。

2 个答案:

答案 0 :(得分:2)

我在嵌套评论方面遇到了类似的问题。这就是我解决它的方法:

export const comment = new schema.Entity("comment", {}, {
    idAttribute: "key"
})
comment.define({
    user: user,
    reactions: {
        data: [reaction]
    },
    children: [comment]
})


export const post = new schema.Entity("post", {
    user: user,
    files: [image],
    comments: {
        data: [comment]
    },
    reactions: {
        data: [reaction]
    }
}, {
    idAttribute: "key"
})

基本上,我将comment定义为新实体,然后才在其自己的实体定义中使用它。我在构造函数中像往常一样定义的其他模式(请参阅post模式中的示例)。希望这会有所帮助。

答案 1 :(得分:-1)

这是一个jq过滤器,用于规范化数据:

def enumerate:
  if type=="array" then .[] else . end ;
def sectionids:
    [ .sections.section | enumerate | .id // empty | tostring ]
  | if .==[] then {} else {sections:.} end ;
def sections:
    {sections:{section:[.]}}
  | .. | .section? | enumerate | objects | del(.sections) + sectionids ;

{
  "result": .id,
  "entities": {
    "sections": (reduce sections as $s ({};.["\($s.id)"]=$s))
  }
}

示例运行(假设data.json中的正确json数据和filter.jq中的上述过滤器)

$ jq -M -f filter.jq data.json
{
  "result": 123,
  "entities": {
    "sections": {
      "123": {
        "id": 123,
        "sections": [
          "1",
          "2",
          "3"
        ]
      },
      "1": {
        "id": 1,
        "name": "test",
        "sections": [
          "125"
        ]
      },
      "2": {
        "id": 2,
        "name": "test2",
        "sections": [
          "124"
        ]
      },
      "3": {
        "id": 3,
        "name": "test3"
      },
      "125": {
        "id": 125,
        "name": "test125"
      },
      "124": {
        "id": 124,
        "name": "test124"
      }
    }
  }
}

Try it online!