反序列化datetime双重编码日期

时间:2018-10-09 10:23:50

标签: django django-rest-framework

我正在尝试反序列化datetime值:

if strcmp(handles.uitable1.Data{1,1}, 'blabla')
    % put here the code that you want to execute if the user selects 'blabla'
end

为了将其用作有效负载中的值:

def default(o):
    if type(o) is datetime.date or type(o) is datetime.datetime:
        return o.isoformat()


def get_user_join_date(user):

    return json.dumps(  
        user.date_joined,
        sort_keys=True,
        indent=1,
        default=default
    )

问题是我的日期时间最终被双编码(它有2个双引号)

  

日期:““ 2018-09-27T12:32:17.577000 + 00:00”“

知道为什么会发生这种情况以及如何解决吗?

1 个答案:

答案 0 :(得分:1)

这里发生的是日期字符串被编码两次。

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 的返回值是字符串get_user_join_date(user)(因此ISO格式的日期时间用双引号引起来)。

此字符串被放入有效负载中,并通过您用于创建JWT令牌的任何内容再次转储到JSON。

一个简单的例子是:

'"2018-09-27T12:32:17.577000+00:00"'

将产生您所看到的输出:

import json
import datetime

def default(o):
    if type(o) is datetime.date or type(o) is datetime.datetime:
        return o.isoformat()

print(json.dumps({
    'date': json.dumps(
        datetime.datetime.now(),
        default=default
    )
}))

有一些解决此问题的方法:

  1. 此问题最简单的解决方案是不使用{"date": "\"2018-10-09T12:53:04.914694\""} 中的json.dumps,而只需返回get_user_join_date

  2. 另一种解决方案是从user.date_joined.isoformat()返回user.date_joined并以某种方式将自定义get_user_join_date函数传递给处理JWT有效负载的JSON编码器。

  3. 也有可能仅从default返回日期对象,但前提是您使用的库足够聪明以处理日期时间对象(有些是)。

    < / li>