#!/usr/bing/env python
# -*- coding: utf-8 -*-
# @author: xiaoxiao
# @date  : 2018/12/7

dt = {}

def analysis_json_to_dict(json):
    # 如果传入的json是list
    if isinstance(json, list):
        # 遍历list的每个元素
        for i, val in enumerate(json):
            # 如果list的元素是一个字典
            if isinstance(val, dict):
                analysis_json_to_dict(val)
            # 否则,如果不是字典,则构建字典,其中value为''
            else:
                val_list = '{"' + str(val) + '":' + '""}'
                dt.update(eval(val_list))
    # 如果传入的json是一个dict
    elif isinstance(json, dict):
        # print("dict:" + str(json))
        # 遍历dict的每组元素
        for dict_key in json:
            dict_value = json[dict_key]
            # 如果dict_value是一个list
            if isinstance(dict_value, list):
                dt[dict_key] = {}
                # 遍历list,可能还有多组dict和其它结构,形如:[{"id" : 1,"name" : "Number1","age" : 11},{"id" : 2,"name" : "Number2","age" : 22},"student"],list里面有两组dict和一个元素student
                for i, val in enumerate(dict_value):
                    # 如果val是一个dict
                    if isinstance(val, dict):
                        # 遍历val(dict结构)
                        for val_k, val_value in val.items():
                            # 如果当前val_key已经存在于dt的key里面,则追加到这个key对应的value里面
                            if val_k in dt[dict_key].keys():
                                # 如果dt[dict_key][val_k]只有一个值,非list结构,则构造一个list,以保存多个值
                                if not isinstance(dt[dict_key][val_k], list):
                                    # 如果dt[dict_key][val_k]这个值是一个字符串
                                    if type(dt[dict_key][val_k]) is str:
                                        temp_str = str(dt[dict_key][val_k])
                                        dt[dict_key][val_k] = temp_str.strip(',').split(',')
                                    # 如果是int型,则先转成str,然后转换成list保存str,最后转换成list中保存int的值
                                    elif type(dt[dict_key][val_k]) is int:
                                        temp_str = str(dt[dict_key][val_k])
                                        dt[dict_key][val_k] = temp_str.strip(',').split(',')
                                        dt[dict_key][val_k] = [int(i) for i in dt[dict_key][val_k]]
                                    # 如果是float型,则先转成str,然后转换成list保存str,最后转换成list中保存float的值
                                    elif type(dt[dict_key][val_k]) is float:
                                        temp_str = str(dt[dict_key][val_k])
                                        dt[dict_key][val_k] = temp_str.strip(',').split(',')
                                        dt[dict_key][val_k] = [float(i) for i in dt[dict_key][val_k]]
                                    # 如果是bool型,则先转成str,然后转换成list保存str,最后转换成list中保存bool的值
                                    elif type(dt[dict_key][val_k]) is bool:
                                        temp_str = str(dt[dict_key][val_k])
                                        dt[dict_key][val_k] = temp_str.strip(',').split(',')
                                        dt[dict_key][val_k] = [bool(i) for i in dt[dict_key][val_k]]
                                    dt[dict_key][val_k].append(val_value)
                                # 否则,如果dt[val_k]已经是一个list,则直接追加到后面
                                else:
                                    dt[dict_key][val_k].append(val_value)
                            # 否则,如果当前val_key未存在于dt的key里面,则直接添加
                            else:
                                dt[dict_key][val_k] = val_value
                    # 否则,val不是dict,直接构造成dict形式,加入到dt中保存,如:"student":""
                    else:
                        val_list = '{"' + str(val) + '":' + '""}'
                        dt[dict_key].update(eval(val_list))
            # 否则,如果dict_value不是一个list
            else:
                # 如果当前key已经存在于dt里面,则追加到这个key对应的value里面
                if dict_key in dt.keys():
                    # 如果dt保存的value还不是list,则需要构造一个list
                    if not isinstance(dt[dict_key], list):
                        # 如果dt[dict_key][val_k]这个值是一个字符串
                        if isinstance(dt[dict_key], str):
                            temp_str = str(dt[dict_key])
                            dt[dict_key] = temp_str.strip(',').split(',')
                        # 否则,如果是int型或Boolean类型
                        else:
                            temp_str = str(dt[dict_key])
                            dt[dict_key] = temp_str.strip(',').split(',')
                            dt[dict_key] = [int(i) for i in dt[dict_key]]
                        dt[dict_key].append(dict_value)
                    # 否则,如果dt保存的值已经是list,直接追加
                    else:
                        dt[dict_key].append(dict_value)
                # 如果当前key未存在于dt里面,则直接增加key-value
                else:
                    dt[dict_key] = dict_value
    return dt

# 场景一:没有头的json数组
d1 = [{"id" : 1,"name" : "Number1","age" : 11},{"id" : 2,"name" : "Number2","age" : 22},{"id" : "3","name" : "Number3","age" : 33}]
json_to_dict1 = analysis_json_to_dict(d1)
print("场景一结果:" + str(json_to_dict1))
dt.clear()  # dt是全局,这里需要dict清除dt,让dt={}
print('-----------------------------------------------------------')


# 场景二:有头的json数组
d2 = {"persons" :[{"id" : 1,"name" : "Number1","age" : 11},{"id" : "2","name" : "Number2","age" : 22},{"id" : 3,"name" : "Number3","age" : 33}]}
json_to_dict2 = analysis_json_to_dict(d2)
print("场景二结果:" + str(json_to_dict2))
dt.clear()  # dt是全局,这里需要dict清除dt,让dt={}
print('-----------------------------------------------------------')

# # 场景三:json数组外含有其它json字符串
d3 = {"code" : 200, "persons" :[{"id" : 1,"name" : "Number1","age" : 11},{"id" : True,"name" : "Number2","age" : 22},{"id" : 3,"name" : "Number3","age" : 33}]}
json_to_dict3 = analysis_json_to_dict(d3)
print("场景三结果:" + str(json_to_dict3))
dt.clear()  # dt是全局,这里需要dict清除dt,让dt={}

运行结果:

场景一结果{'id': [1, 2, '3'], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}
-----------------------------------------------------------
场景二结果{'persons': {'id': [1, '2', 3], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}}
-----------------------------------------------------------
场景三结果{'code': 200, 'persons': {'id': [1, True, 3], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}}


↙↙↙阅读原文可查看相关链接,并与作者交流