繁体   English   中英

有没有一种有效的方法可以使用 Python 中的字典将数据写入 JSON 文件?

[英]Is there an efficient way to write data to a JSON file using a dictionary in Python?

我正在用 Python 编写一个程序来使用一个 API,该 API 需要以一种真正特定的方式从 JSON 有效负载获取输入,如下所示。 poid 元素将在程序的每次运行中包含不同的数字,inventories 元素包含我尝试发送到 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 的项目对应于字典中的第一个键/值对,依此类推。 第一个代码块中的“条件”值将始终以“REF”作为我使用的值,但我还需要将其包含在发送到 API 的最终负载中。 由于每次运行时部件号和制造商字典的长度都不同,因此无论字典中有多少个值,我都需要使用此方法。 不过,该词典和数量列表的长度始终相同。 我认为我能解决这个问题的最好方法是制作一个循环遍历字典并将相应的数据放在需要的地方,然后在循环完成后读取文件并将其作为有效负载发送但请纠正我如果有一种更好的方法可以做到这一点,比如将所有内容都存储在变量中。 我也没有使用 JSON 的经验,所以我尝试使用 JSON 库来完成此操作,但不知道我做错了什么。 我今晚可以尝试编辑它,但我想尽快发布它。

这是一种可能的解决方案:

import json

pn_and_mfgr_dict = {
    'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1',
    'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'
}

quantities = ['1', '3'] 

poid = 22130

payload = {
    'poid': poid, 
    'inventories': [{
        'item': item,
        'mfgr': mfgr,
        'quantity': quantity,
        'condition': 'REF'
      } for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)]
}

print(json.dumps(payload, indent=2))

上面的代码将导致:

{
  "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"
    }
  ]
}

自然地,您可以使用如下方式针对多个poids进行调整:

poids = [22130, 22131, 22132]

for poid in poids:
    # implement here the logic to get items and quantities for
    # each poid

    payload = {
        'poid': poid,
        'inventories': [{
            'item': item,
            'mfgr': mfgr,
            'quantity': quantity,
            'condition': 'REF'
          } for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)]
    }

    print(json.dumps(payload, indent=2))

您将需要对其进行更改,使每个poid具有相应的项目和数量,我将其作为您实施的起点。

您的第二个块是您的输入,因此您可以立即开始写下一个接受这些输入并返回 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)

然后您可以开始使用输入来构建您想要的输出数据。 而且您已经知道该怎么做。

我认为我能解决这个问题的最好方法是制作一个循环遍历字典并将相应的数据放在需要的地方

是的,这就是这样做的方法。

这是我的解决方案版本:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM