我正在从.txt
文件中读取文本,经过一些修改后,iam希望将其写入具有日期格式的json文件中。当我尝试使用json.dumps
将其写入json文件时,它给出了:
“ datetime”类型的对象不可JSON序列化
当我将其序列化并将其写入文件时,它可以正常工作,但是现在日期以字符串形式表示,即来自json Iso date fromat
中我想输入的位置
这是我的代码:
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文件
答案 0 :(得分:3)
JSON不了解任何日期或时间类型。参见table of Python types and how they map to JSON data types。
要在JSON中表示不是JSON固有的任何类型(例如日期或日期和时间),您必须对其进行序列化:将值转换为具有某种特定格式的字符序列。
json.JSONEncoder
class允许扩展以满足此需求:
要将其扩展为识别其他对象,请子类化并实现
default
方法,并使用另一个方法返回o
的可序列化对象(如果可能),否则应调用超类实现(引发{{ 1}})。
您选择了ISO 8601序列化格式来表示日期值;那是一个不错的选择。 TypeError
类型directly supports serialising to ISO representation。
因此,现在您需要一个JSONEncoder子类,该子类将识别datetime.date
值并将其序列化为ISO 8601:
datetime.date
现在您的函数可以使用该编码器类:
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