Сгладить вложенные массивы JSON с помощью наследуемых свойств в Python - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть большой json / словарь с различными уровнями вложенных массивов json, я хотел бы выровнять его, а также зафиксировать взаимосвязь структуры,

Часть моего json выглядит следующим образом:

{
  "name": "root",
  "type": "all",
  "children": [
    {
      "name": "properties",
      "type": "feature",
      "children": [
        {
          "name": "print",
          "type": "feature",
          "children": [
            {
              "name": "graphic print",
              "type": "feature",
              "inherits": true
            },
            {
              "name": "striped print",
              "type": "feature",
              "inherits": true,
              "children": [
                {
                  "name": "pinstriped",
                  "type": "feature",
                  "inherits": true
                },
                {
                  "name": "light stripe",
                  "type": "feature",
                  "inherits": true
                },
                {
                  "name": "wide stripe",
                  "type": "feature",
                  "inherits": true
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "colours",
      "type": "colour",
      "children": [
        {
          "name": "main colours",
          "type": "colour",
          "children": [
            {
              "name": "black",
              "type": "colour",
              "children": [
                {
                  "name": "light black",
                  "type": "colour",
                  "inherits": true
                },
                {
                  "name": "blue black",
                  "type": "colour",
                  "inherits": true
                }
              ]
            },
            {
              "name": "red",
              "type": "colour",
              "children": [
                {
                  "name": "bright red",
                  "type": "colour",
                  "inherits": true
                },
                {
                  "name": "light red",
                  "type": "colour"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "genders",
      "type": "gender",
      "children": [
        {
          "name": "female",
          "type": "gender"
        },
        {
          "name": "male",
          "type": "gender"
        }
      ]
    }
  ]
}

Глубина гнезд не одинакова.Я - хочу, чтобы все узлы (значения "name") - также хотел, чтобы все его родители были, если узел имеет ключ "Inherit" со значением True.

Что-то вроде:

enter image description here

Но если есть лучшие идеи о том, как хранить эти данные, будем рады принять также!

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я думаю, что это должно сделать вашу потребность

def parse_dict_of_dict(_dict, _parent = '', ret_dict={}):
    _name, _children, _inherit = _dict["name"], _dict.get('children', None), _dict.get('inherits', False)
    if _children is not None:
        if isinstance(_children, list):
            for _child in _children:
                parse_dict_of_dict(_child, _name+ ', ' + _parent if _inherit else _name , ret_dict)
    ret_dict[ _name] = _parent.strip(' ').strip(',') if _inherit else None
    return ret_dict
0 голосов
/ 05 декабря 2018

Можете ли вы подробнее рассказать о своем выводе?

ИЛИ вы можете использовать эту функцию, чтобы сгладить вложенный JSON в простой JSON.

def parse_dict_of_dict(_dict, _str = ''):
    ret_dict = {}
    for k, v in _dict.iteritems():
        if isinstance(v, dict):
            ret_dict.update(parse_dict_of_dict(v, _str= _str+k+'_'))
        elif isinstance(v, list):
            for index, item in enumerate(v):
                if isinstance(item, dict):
                    ret_dict.update(parse_dict_of_dict(item,  _str=_str+k+'_%d_'%(index)))
                else:
                    ret_dict.update({k+'_%d'%(index): item})
        else:
            try:
                ret_dict[_str + k] = str(v)
            except Exception as e:
                ret_dict[_str + k] = unicode.encode(v, errors='ignore')
    return ret_dict
...