Python加载json helper方法不起作用

时间:2018-04-30 00:28:33

标签: python json

我已经定义了一个辅助方法来从字符串或文件中加载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)

2 个答案:

答案 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文件吗?如果可以,我会在此之后将其编辑成答案。