我正在尝试反序列化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”“
知道为什么会发生这种情况以及如何解决吗?
答案 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
)
}))
有一些解决此问题的方法:
此问题最简单的解决方案是不使用{"date": "\"2018-10-09T12:53:04.914694\""}
中的json.dumps
,而只需返回get_user_join_date
。
另一种解决方案是从user.date_joined.isoformat()
返回user.date_joined
并以某种方式将自定义get_user_join_date
函数传递给处理JWT有效负载的JSON编码器。
也有可能仅从default
返回日期对象,但前提是您使用的库足够聪明以处理日期时间对象(有些是)。