python - 更新或编辑 json 文件时出现 Json 格式问题

标签 python django

我不明白为什么我的 json 文件带有 ekstra 括号。

这是我的 products.json 文件。右端有 2 个过多的括号。

{"products": {"27": {"price": 5, "pk": 27, "name": "gfasd", "amount": 3, "type": "sokker", "imageURL": "/media/gg_6A1aZ75.jpg"}}}}}

每当保存模型实例时,我都会使用 post_save 函数来更新 json 文件。

@receiver(post_save, sender=item, dispatch_uid="update_json")
def update_stock(sender, instance, **kwargs):
    pk = str(instance.pk)
    with open(MEDIA_ROOT + '/json/products.json', 'r+') as json_file:
        products = json.loads(json_file.read()) 
        print(products) <--- 1
        products["products"].pop(pk, None)
        print(products) <--- 2
        products["products"][pk] = instance.returnAsJSON()
        print(products) <--- 3
        json_file.seek(0)
        json_file.write(json.dumps(products))

打印输出为:

{'products': {'27': {'price': 123, 'type': 'sokker', 'name': 'gfasd', 'amount': 3, 'pk': 27, 'imageURL': '/media/gg_6A1aZ75.jpg'}}}
{'products': {}}
{'products': {'27': {'price': 5, 'pk': 27, 'name': 'gfasd', 'amount': 3, 'type': 'sokker', 'imageURL': '/media/gg_6A1aZ75.jpg'}}}

最后一个打印没有 2 个 ekstra 括号,所以我猜测它可能是我的函数的最后两行。但我真的不知道他们为什么这样做。

最佳答案

该问题可能与您保存文件的方式有关。您应该在 json_file.seek(0) 之后添加 json_file.truncate(),这样它会在保存新内容之前清理文件内容。

--

当你寻找0位置时,你只是改变了光标,但文件的内容仍然是相同的,所以如果文件中有更大的东西,它会保留在那里。
示例:

产品.json

{"foo":"bar"}

.

with open("products.json", "r+") as json_file:
    json_file.seek(0)
    json_file.write(json.dumps({"foo":"b"})) # Will write {"foo":"b"} to the file

products.json 文件内容将不是 {"foo":"b"} 生成的文件,而是 {"foo":"b"}"}

关于python - 更新或编辑 json 文件时出现 Json 格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325861/

相关文章:

python - 检查两个列表是否共享至少一个元素

python - BeautifulSoup 查找多个类别

php - 用于 PHP 的类似 Django 的 URL 路由

python - 在 Django 中生成带有内联摘要的列表/报告

javascript - 在 Django 上下文变量上使用 Javascript 搜索算法

python - ListView 中的 Django 表单,表单 POST 时出错

python - 按列计算两个 DataFrame 的相关性

Python - 如何像行一样读取/解析 csv?

python - 使用 Python 类型的 TypeVar 进行带绑定(bind)的通用类型返回

python - django rest framework lookup_field 通过 OneToOneField