2013-03-15 203 views
0

我有一个二维数组,像这样:转换数组JSON对象

main_array -> [object,object,object,....] 

each object -> [ var_some_string,parent_id,some_random_int] -> fixed length 

我需要将此数组转换成json对象像这样..

{ var_some_string: { var_some_string : { var_some_string: -1}}} 

的PARENT_ID是main_array对象作为当前对象的父亲的位置

我希望这个问题是可以理解的。

main_array = [ 
       ["some_string0",-1,1], 
       ["some_string1",-1,1] , 
       ["some_string2",-1,1] , 
       ["some_string3",0,-1], 
       ["some_string4",0,-1], 
       ["some_string5",0,-1], 
       ["some_string6",1,-1], 
       ["some_string7",1,-1], 
       ["some_string8",2,-1], 
       ["some_string9",5,-1], 
       ["some_string10",7,-1], 
       ["some_string11",9,-1], 
      ] 

json对象是这个

main_json = { 
       'some_string0' : { 
           'some_string3' : -1000, 
           'some_string4' : -1000, 
           'some_string5' : { 
              'some_string9' : { 
                  'some_string11' : -1000 
                  }, 
                }, 
           }, 
       'some_string1' : { 
           'some_string6' : -1000, 
           'some_string7' : { 
               'some_string10' : -1000, 
                } 
           } 
       'some_string2' : { 
           'some_string8' : -1000 
           } 
       } 

我敲我的头在如何解决这个问题?

+0

什么main_json手段呢'-1000'? – HYRY 2013-03-15 11:01:45

+0

没什么可以是任何东西..我只是保留它..可能是没有 – boltsfrombluesky 2013-03-15 11:02:14

+0

所以在你的main_array中,第三个值(-1)意味着它们是根元素,而0,1,2,3是对父元素的引用元件? – 2013-03-15 11:03:53

回答

3
def replace_empty_dict_with(d, value): 
    for k, v in d.iteritems(): 
     if len(v) == 0: 
      d[k] = value 
     else: 
      replace_empty_dict_with(v, value) 

d = {} 
w = {} 
for node, pid, _ in main_array: 
    if pid == -1: 
     w[node] = d[node] = {} 
    else: 
     parent = main_array[pid][0] 
     w[node] = w[parent][node] = {} 

replace_empty_dict_with(d, -1) 
import pprint 
pprint.pprint(d) 

输出:

{'some_string0': {'some_string3': -1, 
        'some_string4': -1, 
        'some_string5': {'some_string9': {'some_string11': -1}}}, 
'some_string1': {'some_string6': -1, 'some_string7': {'some_string10': -1}}, 
'some_string2': {'some_string8': -1}} 
+0

tyvm ..我想我从你的解决方案中学到了很多东西:) – boltsfrombluesky 2013-03-15 11:47:24

0

我理解这项任务有点迪fferently。我认为some_random_int应该成为最终字典中的值(不一定是-1)。

main_json = {} 
id_to_dict_reference = { 
     -1: main_json 
} 
id_to_container = {} 
id_to_key_name = {} 

for id, (var_some_string, parent_id, some_random_int) in enumerate(main_array): 
     id_to_key_name[id] = var_some_string 
     dict_reference = id_to_dict_reference[parent_id] 

     if dict_reference is None: 
      parent_container = id_to_container[parent_id] 
      key_name = id_to_key_name[parent_id] 
      if not isinstance(parent_container[key_name], dict): 
       parent_container[key_name] = {} 
      parent_container[key_name][var_some_string] = some_random_int 
      id_to_dict_reference[id] = None 
      id_to_container[id] = parent_container[key_name] 
      id_to_dict_reference[parent_id] = parent_container[key_name] 
     else: 
      dict_reference[var_some_string] = some_random_int 
      id_to_container[id] = dict_reference 
      id_to_dict_reference[id] = None 

print main_json 

输出:

{'some_string0': {'some_string3': -1, 
        'some_string4': -1, 
        'some_string5': {'some_string9': {'some_string11': -1}}}, 
    'some_string1': {'some_string6': -1, 'some_string7': {'some_string10': -1}}, 
    'some_string2': {'some_string8': -1}}