将 JSON 处理成单独列表的最佳方法?

时间:2021-08-01 13:56:42

标签: python json python-3.x

所以在收到带有以下代码的 JSON 后:

ctype, pdict = cgi.parse_header(self.headers.get('content-type'))
if ctype == 'application/JSON':
    length = int(self.headers.get('content-length'))
    input = JSON.loads(self.rfile.read(length))

我从 print(input) 收到了这种 JSON,它是一个字典:

{'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0],
                  'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0],
                  'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0],
                  'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0],
                  'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0],
                  'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}

正如我们所见,JSON 中的每个“列表”都有一个“数组”。如何将它们提取到单独的 python 列表变量中?

例如:

dog = []
cat = []
bird = []
chicken = []

我一直在研究解决方案,范围从使用 for 循环到模块导入。我相信有一个更简单的解决方案来提取这个。

你能分享一个想法吗?

2 个答案:

答案 0 :(得分:0)

就像您提到的问题的评论一样,您已经有一本字典,这可能是正确的数据结构。但是,如果您需要从 dict 中提取一堆东西作为单独的项目,operator.itemgetter 是一种方便、易读的方法:

from operator import itemgetter

jsn = {'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0], 'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0], 'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0], 'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0], 'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0], 'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}

dog,cat,bird,chicken = itemgetter('dog','cat','bird','chicken')(jsn['packageInput'])

另一方面,如果您正在寻找一种动态方式来执行此操作 - 在拥有 json 之前您不知道将创建哪些变量 - 这是一个错误。它只是不起作用——毕竟你需要知道变量名以后才能在程序中使用它们。如果 print(cat) 不在 json 中,则稍后在程序中使用 "cat" 会崩溃。字典可以让你处理这个问题。

答案 1 :(得分:0)

exec 正是您所需要的,但您应该不惜任何代价避免使用它。参考this

d = {'packageInput': {'dog': [4.18, 0.08, 41.51, 0, 0, 0, 0, 0], 'cat': [2.752, 3.69, 2.29, 0, 0, 0, 0, 0], 'bird': [4.45, 4.97, 2.37, 0, 0, 0, 0, 0], 'chicken': [0.81, 0.61, '0.336', 0, 0, 0, 0, 0], 'min': ['1', 0, 0, 0, 0, 0, '5', 0, 0, 0, 0, 0], 'max': [4, 4, 4, 4, 100, 100, 100, 0, 0, 0, 0, 0]}}
obj = d.get('packageInput')
for k in obj.keys():
    exec(f"{k} = {obj.get(k)}")
print(dog)
#[4.18, 0.08, 41.51, 0, 0, 0, 0, 0]

推荐的解决方案, 将它用作已经是的字典。

dog = obj.get('dog')