是否有一种有效的方法来写数据到JSON文件使用字典在Python?



我正在用Python编写一个程序,使用一个API,需要以一种非常具体的方式从JSON有效负载中获取输入,如下所示。poid元素将在每次运行程序时包含不同的数字,inventory元素包含我试图发送给API的字典列表。

[
{   
"poid":"22130",
"inventories": 
[        
{       
"item": "SAMPLE-ITEM-1",
"mfgr": "SAMPLE-MANUFACTURER-1",
"quantity": "1",
"condition": "REF"
},
{       
"item": "SAMPLE-ITEM-2",
"mfgr": "SAMPLE-MANUFACTURER-2",
"quantity": "3",
"condition": "REF"
}
]   
}
]

我需要放入文件的数据存储在字典和列表中,如下所示。为了简单起见,我展示了用另一种方法创建字典和列表后的样子。我不确定这是否是存储这些数据的最有效的方式,当我不得不将其写入JSON。

pn_and_mfgr_dict = {'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1', 'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'}
quantities = ["1","3"] 
poid = 22130 #this will be different each run

如果我上面写的有意义,我需要生成一个JSON文件,看起来像第一个代码块给出第二个代码块的信息。数量列表中索引0处的项对应于字典中的第一个键/值对,依此类推。"condition"value在第一个代码块中总是带有"REF"作为我使用的值,但我还需要将其包含在发送到API的最终有效负载中。由于零件号和制造商字典在每次运行时的长度不同,因此无论字典中有多少值,我都需要此方法工作。这个字典和数量列表的长度总是相同的。我认为我可以解决这个问题的最好方法是做一个for循环,迭代字典,并把各自的数据放在需要的地方,然后在for循环完成时读取文件,并将其作为有效载荷发送,但请纠正我,如果有更好的方法来做到这一点,比如将所有内容存储在变量中。我也没有JSON的经验,所以我尝试使用JSON库来完成这一点,不知道我做错了什么。我可以用我今晚的尝试来编辑这个,但我想尽快发布这个。

第二个块是您的输入,因此您可以立即开始编写一个函数,接受这些输入并返回一个JSON字符串。

import json
from typing import Dict, List

def jsonify_data(pn_and_mfgr_dict: Dict, quantities: List, poid: int):
constructed_data = []  # TODO
return json.dumps(constructed_data)

然后可以开始使用输入来构造所需的输出数据。而且你已经知道怎么做了。

我认为解决这个问题的最好方法是创建一个for循环,遍历字典并将各自的数据放在需要的位置

对,就是这么做的。

这是我的解决方案:

import json
from typing import Dict, List

def jsonify_data(pn_and_mfgr_dict: Dict, quantities: List, poid: int):
inventories = [
{
'item': item,
'mfgr': mfgr,
'quantity': quantity,
'condition': 'REF',
} for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)
]
constructed_data = [
{
'poid': f'{poid}',
'inventories': inventories,
}
]
return json.dumps(constructed_data)
import json
data = {'inventories': [{'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1'}, {'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'}]}
quantities = ["1", "3"]
poid = 22130
# Add poid to data
data['poid'] = poid
# Add quantities to data
for item in data['inventories']:
item['quantity'] = quantities.pop(0)
# Serializing json
json_object = json.dumps(data, indent=4)
print(json_object)

最新更新