Python将JSON重构为不同的JSON结构

Python将JSON重构为不同的JSON结构,python,arrays,json,Python,Arrays,Json,我有一堆JSON数据,大部分是手工完成的。几千行。我需要使用Python将其重构为完全不同的格式 我的“东西”概述: 列:我的数据的基本“单位”。每列都有属性。不要担心属性的含义,但是如果属性存在,则需要为每一列保留这些属性 文件夹:文件夹将列和其他文件夹分组在一起。文件夹当前没有属性,它们(当前)只包含其他文件夹和列对象(对象在这里不一定指JSON对象…更多的是“实体”) Universe:Universe将所有东西都分成大块,在我的项目的更大范围内,它们无法相互交互。这在这里并不重要,但他们

我有一堆JSON数据,大部分是手工完成的。几千行。我需要使用Python将其重构为完全不同的格式

我的“东西”概述:

:我的数据的基本“单位”。每列都有属性。不要担心属性的含义,但是如果属性存在,则需要为每一列保留这些属性

文件夹:文件夹将列和其他文件夹分组在一起。文件夹当前没有属性,它们(当前)只包含其他文件夹和列对象(对象在这里不一定指JSON对象…更多的是“实体”)

Universe:Universe将所有东西都分成大块,在我的项目的更大范围内,它们无法相互交互。这在这里并不重要,但他们就是这么做的

一些限制:

  • 列不能包含其他列对象、文件夹对象或宇宙对象
  • 文件夹不能包含宇宙对象
  • 宇宙不能包含其他宇宙对象
目前,我有以下列:

"Column0Name": {
  "type": "a type",
  "dtype": "data type",
  "description": "abcdefg"
}
我需要它去:

{
  "name": "Column0Name",
  "type": "a type",
  "dtype": "data type",
  "description": "abcdefg"
}
本质上,我需要将列键值东西转换为一组东西(我不熟悉JSON,不知道术语)。我还需要每个文件夹以两个新的JSON数组结束(除了“name”:“FolderName”键值对)。它需要添加一个
“文件夹”:[]
“列”:[]
。所以我有一个文件夹:

"Folder0Name": {
  "Column0Name": {
    "type": "a",
    "dtype": "b",
    "description": "c"
  },
  "Column1Name": {
    "type": "d",
    "dtype": "e",
    "description": "f"
  }
}
我们需要做的是:

{
  "name": "Folder0Name",
  "folders": [],
  "columns": [
    {"name": "Column0Name", "type": "a", "dtype": "b", "description": "c"},
    {"name": "Column1Name", "type": "d", "dtype": "e", "description": "f"}
  ]
}
这些文件夹也将在其父世界中的数组中结束。同样,每个宇宙最终都会有“名称”、“文件夹”和“列”之类的东西。因此:

{
  "name": "Universe0",
  "folders": [a bunch of folders in a JSON array],
  "columns": [occasionally some columns in a JSON array]
}
底线

  • 我想在使用
    JSON
    Python模块导入JSON数据后,我需要一个递归函数来迭代所有嵌套字典
  • 我在想
    yield
    的某种用法可能会有所帮助,但我还不太熟悉它
  • 在我运行时更新
    dict
    s会更容易,还是在我运行时销毁每个键值对并构建一个全新的
    dict
这是我到目前为止所拥有的。我一直坚持让生成器返回实际的字典,而不是生成器对象

导入json
类诱惑词:
“”“保存在json文件中找到的所有宇宙的容器”“”
def uuu init uuu(self,文件名):
self.\u fn=文件名
self.data={}
self.read_data()
def读取_数据(自身):
以开放式(自身)为鳍:
self.data=json.load(fin)
回归自我
def宇宙_键(自):
“”“从所有宇宙的目录中获取下一个宇宙密钥
钥匙将被用作宇宙的名称。
"""
自我数据收益率
类宇宙:
def uuu init uuu(self,json_文件名):
self.\u au=AllUniverses(文件名=json\u文件名)
self.uni\u key=self.\u au.universe\u key()
self.\u universe\u data=self.\u au.data.copy()
self.\u col\u attrs=['type','dtype','description','aggregation']
self.\u文件夹\u列表=[]
self.\u列\u列表=[]
自我。_type=“宇宙”
self._name=“”
self.uni=dict()
self.is_folder=False
self.is_列=False
def输出(自):
#TODO:是否将其传递到json.dump?
#TODO:仍然需要获取实际的文件夹和列字典
#从发电机上
out={
“姓名”:本人的姓名,
“类型”:“宇宙”,
“文件夹”:[f.me代表f在self.\u文件夹\u列表中],
“列”:[c.me代表c在self.\u columns\u list]}
返回
def更新_宇宙(自身):
“获取下一个宇宙”
宇宙k=下一个(self.uni_键)
self.\u name=str(宇宙)
self.uni=self.\u universe\u data.pop(universe\u k)
回归自我
def parse_节点(自身):
“”“处理所有子节点”“”
nodes=[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\在self.uni.keys()中]
对于k in节点:
v=自校pop(k)
self._为_列(val=v)
如果self.is_列:
fc=列(数据=v,键名称=k)
self.\u columns\u list.append(fc)
其他:
fc=文件夹(数据=v,键名=k)
self.\u folders\u list.append(fc)
回归自我
def_是_列(self,val):
“”“确定val是列还是文件夹对象”“”
self.is_folder=False
self.\u列=False
如果是持续(val,dict)而不是val:
self.is_folder=True
如果不存在(val,dict):
raise TypeError('无法处理不是dict类型的输入')
elif any([i in val.keys()表示i in self.\u col\u attrs]):
self.\u列=真
其他:
self.is_folder=True
回归自我
def parse_子项(自身):
对于self.\u文件夹\u列表中的文件夹:
断言(isinstance(folder,folder)),f'bletch idk what caster'
folder.parse_节点()
类文件夹:
定义初始化(自身、数据、键名称):
self.\u data=data.copy()
self.\u name=str(键名称)
self.\u node\u keys=[\ufor\uin self.\u data.keys()]
self.\u文件夹=[]
self._列=[]
self.\u col\u attrs=['type','dtype','description','aggregation']
@财产
定义我(自我):
#也许这会迫使代码解析这个函数的所有子函数
#文件夹?需要将生成器转换为实际字典
返回{“name”:self.\u name,“type”:“Folder”,
“列”:[(c.me表示self.\u列中的c)],
“文件夹”:[(f.me代表f在self.\u文件夹中)]]
def parse_节点(自身):
“”“分析此文件夹的所有子级。”
解析所有节点
{
    "name":"UniverseName",
    "type":"Universe",
    "folder":[
        {"name":"Folder0Name",
            "type":"Folder",
            "columns":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB0B0>],
            "folders":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB190>]
        },
        {"name":"Folder2Name",
            "type":"Folder",
            "columns":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB040>],
            "folders":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB120>]
        },
        {"name":"Folder4Name",
            "type":"Folder",
            "columns":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB270>],
            "folders":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB200>]
        },
        {"name":"Folder6Name",
            "type":"Folder",
            "columns":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB2E0>],
            "folders":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB350>]
        },
        {"name":"Folder8Name",
            "type":"Folder",
            "columns":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB3C0>],
            "folders":[<generator object Folder.me.<locals>.<genexpr> at 0x000001ACFBEDB430>]
        }
    ],
    "columns":[]
}