2017-01-03 1 views
-1

Я следующий JSON данные:Как конвертировать JSON в формат, необходимый для создания диаграммы солнечных лучей D3?

{ 
    "data": { 
     "databis": { 
      "dataexit": { 
       "databis2": { 
        "1250": { } 
       } 
      }, 
      "datanode": { 
       "20544": { } 
      } 
     } 
    } 
} 

Я хочу, чтобы использовать его для создания D3 sunburst diagram, но это требует different data format:

{ 
    "name": "data", 
    "children": [ 
     { 
      "name": "databis", 
      "children": [ 
       { 
        "name": "dataexit", 
        "children": [ 
         { 
          "name": "databis2", 
          "size": "1250" 
         } 
        ] 
       }, 
       { 
        "name": "datanode", 
        "size": "20544" 
       } 
      ] 
     } 
    ] 
} 

Как я могу сделать это с помощью Python? Я думаю, мне нужно использовать рекурсивную функцию, но я не знаю, с чего начать.

+6

Вещь, которую Вы хотите не является ни действительным JSON ни действительным Python. – khelwood

+1

Пожалуйста, проявите попытку решить эту проблему. – JAL

+0

Возможная ошибка: [Как обновить JSON-файл с помощью Python?] (Http://stackoverflow.com/q/24579896/2415822) – JAL

ответ

1

Вы можете использовать рекурсивное решение с функцией, которая принимает имя и словарь в качестве параметра. Для каждого элемента в заданном dict он снова вызывает себя, чтобы сгенерировать список детей, который выглядит так: {'name': 'name here', 'children': []}.

Тогда он будет проверять специальный случай, когда есть только один ребенок, у которого есть ключ children со значением пустого списка. В этом случае возвращается dict, который задал параметр как имя и имя дочернего элемента в качестве размера. Во всех остальных случаях функция возвращает dict с именем и дочерними элементами.

import json 

data = { 
    "data": { 
     "databis": { 
      "dataexit": { 
       "databis2": { 
        "1250": { } 
       } 
      }, 
      "datanode": { 
       "20544": { } 
      } 
     } 
    } 
} 

def helper(name, d): 
    # Collect all children 
    children = [helper(*x) for x in d.items()] 

    # Return dict containing size in case only child looks like this: 
    # {'name': '1250', 'children': []} 
    # Note that get is used to so that cases where child already has size 
    # instead of children work correctly 
    if len(children) == 1 and children[0].get('children') == []: 
     return {'name': name, 'size': children[0]['name']} 

    # Normal case where returned dict has children 
    return {'name': name, 'children': [helper(*x) for x in d.items()]} 

def transform(d): 
    return helper(*next(iter(d.items()))) 

print(json.dumps(transform(data), indent=4)) 

Выход:

{ 
    "name": "data", 
    "children": [ 
     { 
      "name": "databis", 
      "children": [ 
       { 
        "name": "dataexit", 
        "children": [ 
         { 
          "name": "databis2", 
          "size": "1250" 
         } 
        ] 
       }, 
       { 
        "name": "datanode", 
        "size": "20544" 
       } 
      ] 
     } 
    ] 
} 
+0

A Thousand Thanks Bro: D/D это работает. действительно удивительно. –