【问题标题】:unable to update JSON using python无法使用 python 更新 JSON
【发布时间】:2020-11-02 08:34:28
【问题描述】:

我正在尝试从以下 json 更新交易 ID:

{
    "locationId": "5115",
    "transactions": [
        {
            "transactionId": "1603804404-5650",
            "source": "WEB"
        } ]

我已经完成了以下代码,但它不会更新事务 id,而是将事务 id 插入到块的末尾:-

 try:
        session = requests.Session()
        with open(
                "sales.json",
                "r") as read_file:
            payload = json.load(read_file)

            payload["transactionId"] = random.randint(0, 5)
        with open(
                "sales.json",
                "w") as read_file:
            json.dump(payload, read_file)

输出:-

{
    "locationId": "5115",
    "transactions": [
        {
            "transactionId": "1603804404-5650",
            "source": "WEB"
        } ]
}
'transactionId': 1
}

预期输出:-

{
    "locationId": "5115",
    "transactions": [
        {
            "transactionId": "1",
            "source": "WEB"
        } ]

【问题讨论】:

  • 应该是payload["transactions"][0]["transactionId"]

标签: python python-3.x python-2.7 python-requests


【解决方案1】:

这样做可以,但仅限于您的具体情况:

payload["transactions"][0]["transactionId"] = xxx

对于诸如“事务”键不在字典中,或者没有记录或有多个记录等情况应该进行错误处理

此外,如果您希望按照所需的输出建议获得字符串类型的记录,则需要分配 =str(your_random_number) 而不是 int

【讨论】:

    【解决方案2】:

    如果您只想找到transactionId 键并且您不知道它可能存在的确切位置。你可以做-

    from collections.abc import Mapping
    
    def update_key(key, new_value, jsondict):
        new_dict = {}
        for k, v in jsondict.items():
            if isinstance(v, Mapping):
                # Recursive traverse if value is a dict
                new_dict[k] = update_key(key, new_value, v)
            elif isinstance(v, list):
                # Traverse through all values of list
                # Recursively traverse if an element is a dict
                new_dict[k] = [update_key(key, new_value, innerv) if isinstance(innerv, Mapping) else innerv for innerv in v]
            elif k == key:
                # This is the key to replace with new value
                new_dict[k] = new_value
            else:
                # Just a regular value, assign to new dict
                new_dict[k] = v
        return new_dict
    

    给定一个字典-

    {
        "locationId": "5115",
        "transactions": [
            {
                "transactionId": "1603804404-5650",
                "source": "WEB"
            } ]
    }
    

    你可以做-

    >>> update_key('transactionId', 5, d)
    {'locationId': '5115', 'transactions': [{'transactionId': 5, 'source': 'WEB'}]}
    

    【讨论】:

      【解决方案3】:

      是的,因为 transactionId 在 transactions 节点内。所以你的代码应该是这样的:

      payload["transactions"][0].transactionId = random.randint(0, 5)
      

      payload["transactions"][0]["transactionId"] = random.randint(0, 5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-16
        • 2018-11-11
        • 2019-10-14
        • 1970-01-01
        • 2015-04-18
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多