2017-10-21 112 views
-2

我试图解码一些JSON使用Python 3. json库时引起“期望值......”错误:datetime.datetimes在JSON是导致“期待值”的错误在Python

>>> import json 
>>> json.loads("datetime.datetime(2017, 1, 1, 0, 0, 0, 0)") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 357, in raw_decode 
    raise JSONDecodeError("Expecting value", s, err.value) from None 
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

使用object_hook在这里似乎没有帮助,我尝试添加一个,但它甚至没有被调用。这是怎么回事?

+1

是什么让你认为这是有效的JSON? –

+0

你究竟想在这里做什么?正如Martijn所说 - 这不是JSON - 但我想知道你是否试图创建一个例子在这里发布,也许简化它有点误导你可能实际上试图实现... –

+0

@MartijnPieters它出现在我从API获得的一些JSON中。我一开始也很惊讶,但后来我发现了很多类似的使用datetime和JSON的python问题,我认为这只是我没有意识到的一些JSON特性。 –

回答

2

json.loads()只接受有效的JSON数据。您没有有效的JSON。你不能把Python对象名称放在那里。

对象挂钩仅适用于{....}JSON对象。术语对象这里没有扩展到Python定义。

如果你想把日期时间值放到JSON中,你需要想出不同的方案。 JSON没有任何本地支持;通常特定的API只是记录了什么值应该是日期时间值,在读取JSON数据时,您在应用程序级别处理日期,而不是在解码级别。

如果您发现"datetime.datetime(2017, 1, 1, 0, 0, 0, 0)"字符串在JSON文档中,那么就JSON解析器而言,这些只是字符串。字符串的内容不被处理,这取决于应用程序层要做的事情。

如果这些字符串是一个JSON对象({"key": "datetime.datetime(...)", ...})内的值,那么你可以使用object_hook回调来检查所有这些价值观,并与datetime情况下替换它们:

import datetime, re 

datetime_pat = re.compile(r'datetime\.datetime\([\d, ]+\)') 

def convert_datetime_values(d): 
    for key, value in d.items(): 
     if datetime.pat.match(value): 
      d[key] = eval(value) 
    return d 

你不能这样做但对于JSON数组也是如此。

+0

我见过一些系统转储''datetime.datetime(...)“'作为值 - 仍然不确定OP是否简化了他们的问题太多,他们*处理JSON,但正在设法解决如何处理出现的问题。 –

+0

@JonClements:但那些仍然是字符串那么应用层就必须解释JSON库没有设施来解释它们 –

+0

我知道:)我只是指出了问题的问题,显示的问题不太可能是问题的实际意思问 - 但你已经在编辑中解决了这个问题:p –