如何在不序列化的情况下将带有Date的文本写入json文件

时间:2018-11-07 08:53:40

标签: python json

我正在从.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文件

1 个答案:

答案 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