gpt4 book ai didi

python - 如何在不序列化的情况下将带有日期的文本写入 JSON 文件

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:53 24 4
gpt4 key购买 nike

我正在从纯文本文件中读取一些文本。做了一些修改后,我想写另一个包含 JSON 的文件,其中也有日期格式。

当我尝试使用 json.dumps 将其转换为 JSON 时,它给出:

Object of type 'datetime' is not JSON serializable

当我将它序列化并写入文件时,它工作正常。但现在日期以字符串格式表示。我想使用 JSON ISO 日期格式

这是我的代码:

def getDatetimeFromISO(s):
d = dateutil.parser.parse(s)
return d

with open('./parsedFiles/Data.json','w+') as f:
parsedData = []

for filename in os.listdir('./Data'):
parsed = {}
parsed["Id"] = filename[:-4]
breakDown = []
with open('./castPopularityData/'+str(filename),'r') as f1:
data = ast.literal_eval(f1.read())
for i in range(0,len(data)):
data[i]["date"] = getDatetimeFromISO(data[i]['date'])
data[i]["rank"] = data[i]['rank']
breakDown.append(data[i])
parsed["breakDown"] = breakDown
parsedData.append(parsed)
print(parsedData)
json.dump(parsedData, f, indent=4)

如何将 ISO 日期写入 JSON 文件?

我不想序列化我的数据,这使得日期格式变成了字符串。我想将日期作为日期本身写入 JSON 文件。

最佳答案

JSON 不知道任何日期或时间类型。查看table of Python types and how they map to JSON data types .

要在 JSON 中表示任何非 JSON 原生类型(例如日期或日期+时间),您必须对其进行序列化:将该值转换为具有某种特定格式的字符序列。

json.JSONEncoder class允许扩展以满足这种需求:

To extend this to recognize other objects, subclass and implement a default method with another method that returns a serializable object for o if possible, otherwise it should call the superclass implementation (to raise TypeError).

您已选择 ISO 8601 序列化格式来表示日期值;这是一个不错的选择。 datetime.date 类型 directly supports serialising to ISO representation .

所以现在您需要一个 JSONEncoder 子类来识别 datetime.date 值,并将它们序列化为 ISO 8601:

import datetime
import json

class MySpecificAppJSONEncoder(json.JSONEncoder):
""" JSON encoder for this specific application. """

def default(self, obj):
result = NotImplemented
if isinstance(obj, datetime.date):
result = obj.isoformat()
else:
result = json.JSONEncoder.default(self, obj)
return result

现在您的函数可以使用该编码器类:

json.dump(parsed_data, outfile, indent=4, cls=MySpecificAppJSONEncoder)

关于python - 如何在不序列化的情况下将带有日期的文本写入 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com