从列表列表中序列化 json 文件

Posted

技术标签:

【中文标题】从列表列表中序列化 json 文件【英文标题】:serializing a json file from list of list 【发布时间】:2015-03-31 00:19:50 【问题描述】:

所以我有一个元素列表:

elements = [room1, room2, room3]

我还有一个每个房间都有的键/值属性列表:

keys = ["level", "finish1", "finish2"]
values = [["ground", "paint1", "carpet1"],["ground", "paint1", "paint2"], ["second level", "paint1", "paint2"]]

有没有办法将这两个列表序列化成一个结构如下的 json 文件:

'room1': ['level': 'ground', 'finish1': 'paint1', 'finish2': 'carpet1'],'room2': ['level': 'ground', 'finish1': 'paint1', 'finish2': 'paint2'],'room3': ['level': 'second level', 'finish1': 'paint1', 'finish2': 'paint2']

我在这个不支持字典的奇怪平台上,所以我为它们创建了一个类:

class collection():
def __init__(self,name,key,value):
    self.name = name
    self.dict = 
    self.dict[key] = value
def __str__(self):
    x = str(self.name) + " collection"
    for key,value in self.dict.iteritems():
        x = x + '\n'+ '  %s= %s ' % (key, value)
    return x

然后我找到了一段代码,可以让我从两个并行列表中创建一个基本的 json 代码:

def json_list(keys,values):
lst = []
for pn, dn in zip(values, keys):
    d = 
    d[dn]=pn
    lst.append(d)
return json.dumps(lst)

但是这段代码没有给我 room1: [ ... structure

任何想法都会很棒。我正在使用的这个软件是基于 IronPython2.7

好的,所以上面的效果很好。我从评论中得到了很好的反馈。我还有一个我没有考虑到的变化。有时,当我尝试混合多个元素类型(房间、列等)时,它们可能没有相同数量的属性。例如,房间可以有(水平、饰面和饰面),而柱子可能只有厚度和材料。如果我将它们全部组织在并行列表键/值中,是否可以修改以下定义:

keys = [[thickness, material],[level,finish,finish]]
values = [[100,paint],[ground,paint,paint]]
elements = [column,room]

我需要如何修改下面的定义才能使其正常工作?我想再次导出一个 json 文件。

【问题讨论】:

什么意思“不支持字典”?你的collection使用字典实现 好吧,由于某种原因,当我尝试在函数之外创建字典时,它会引发错误。所以我可以在 json_list 函数内部使用 d = ,但不能在函数外部使用。 如果你在外面做d = dict()会发生什么? 如果我做 d = dict() 然后设置我的 OUT = d 然后 OUT 打印出空列表 但如果我尝试这样做:names = ["Nick", "Alice", "Kitty"] rating = [1, 2, 3] dictionary_test = dict(zip(names, rating) ) 它将返回错误“'string' 不包含 'Key' 的定义” 【参考方案1】:

我不知道没有字典 Python 是如何工作的,所以请测试一下并告诉我它显示的错误:

import json

elements = ['r1','r2','r3']
keys = ["level", "finish1", "finish2"]
values = [["ground", "paint1", "carpet1"],["ground", "paint1", "paint2"], ["second level", "paint1", "paint2"]]
d = dict()

for (index, room) in enumerate(elements):
    d[room] = dict()
    for (index2, key) in enumerate(keys):
        d[room][key] = values[index][index2]

print json.dumps(d)

【讨论】:

你能看看我对帖子所做的编辑吗?我不是在处理与值列表具有完全相同结构的键列表。我这样做是因为我的对象可能并不总是具有相同数量的属性,所以我不能使用单个属性列表来定义它们。现在每个对象都有一个键和属性列表,它们的长度是匹配的。你能帮忙吗? 当然。但是你需要保持一致。如果您的结构与您在编辑中描述的一样,请将我的代码中的第 10 行替换为 for (index2, key) in enumerate(keys[index]):【参考方案2】:

这可能有效。

#-*- encoding: utf-8 -*-
import json

elements = ["room1", "room2", "room3"]
keys = ["level", "finish1", "finish2"]
values = [["ground", "paint1", "carpet1"],["ground", "paint1", "paint2"], ["second level", "paint1", "paint2"]]

what_i_want = dict((room, [dict(zip(keys, value))])
                   for room, value in zip(elements, values))
print(json.dumps(what_i_want))

【讨论】:

以上是关于从列表列表中序列化 json 文件的主要内容,如果未能解决你的问题,请参考以下文章

反序列化后无法获取从xml文件返回的项目列表

C# - 如何从 Azure DevOps 工作项列表反序列化 json?

使用 datagridview 将列表序列化为现有的 .Json 文件

从 C# 中的文件反序列化 Json

ASP.NET Core —上传.json文件并转换为List

Unity Json反/序列化嵌套数据[重复]