我已经定义了一个辅助方法来从字符串或文件中加载json,如下所示:
def get_json_from_string_or_file(obj):
if type(obj) is str:
return json.loads(obj)
return json.load(obj)
当我尝试使用文件时,load
调用失败,但出现以下异常:
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 291, in load
**kw)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
我已经对我的json文件进行了三次检查,它绝对不是空的,只是有一个简单的foo bar键值映射。
另外,我正在将json文件提供给方法:
os.path.join(os.path.dirname(__file__), "..", "test.json")
有什么想法在这里发生?
编辑:我将我的帮助方法更改为以下内容以修复答案和注释中解决的错误,但它仍然无法正常工作,当我传入已打开的文件时,我收到同样的错误。def get_json_from_file(_file):
if type(_file) is str:
with open(_file) as json_file:
return json.load(json_file)
return json.load(_file)
编辑#2:我发现了问题!如果您连续两次在打开的文件上调用json.load
,则会发生此错误。事实证明,我的应用程序的另一部分已经打开了该文件。
这是一些复制代码:
with open("/test.json") as f:
json.load(f)
json.load(f)
答案 0 :(得分:3)
以下代码有效。
import os
import json
def get_json_from_string_or_file(obj):
if type(obj) is str:
return json.loads(obj)
return json.load(obj)
filename = os.path.join(os.path.dirname(__file__), "..", "test.json")
with open(filename, 'r') as f:
result = get_json_from_string_or_file(f)
print(result)
我将文件名传递给函数时再现了{p> ValueError: No JSON object could be decoded
,如get_json_from_string_or_file(filename)
。
import os
import json
def get_json_from_file(_file):
if type(_file) is str: # <-- unnecessary if
with open(_file) as json_file:
return json.load(json_file)
return json.load(_file)
filename = os.path.join(os.path.dirname(__file__), "..", "test.json")
result = get_json_from_file(filename)
print(result)
# python2: {u'foo': u'bar'}
# python3: {'foo': 'bar'}
答案 1 :(得分:0)
对不起,我发表评论,但我缺乏代表。你能粘贴一个不能用于pastebin的样本JSON文件吗?如果可以,我会在此之后将其编辑成答案。