显示不是“无JSON对象可以被解码”

显示不是“无JSON对象可以被解码”

问题描述:

Python代码从一些长期复杂化JSON文件加载数据更好的错误消息:显示不是“无JSON对象可以被解码”

with open(filename, "r") as f: 
    data = json.loads(f.read()) 

(注:最好的代码版本应该是:

with open(filename, "r") as f: 
    data = json.load(f) 

但两者表现出类似的行为)

对于许多类型的JSON错误(丢失分隔符,在字符串不正确反斜线等),这个打印包含行和列n一个很好的有用信息发现JSON错误的地方。

然而,对于其他类型的JSON错误(包括经典的“在列表的最后一个项目用逗号”,而且其他像大写真/假),Python的输出只是:

Traceback (most recent call last): 
    File "myfile.py", line 8, in myfunction 
    config = json.loads(f.read()) 
    File "c:\python27\lib\json\__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "c:\python27\lib\json\decoder.py", line 360, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "c:\python27\lib\json\decoder.py", line 378, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

对于这种类型的ValueError,你如何让Python告诉你JSON文件中的错误在哪里?

+0

你可以转储文件的摘录吗? – Ketouem 2013-02-15 16:56:09

+0

我不想在特定文件中找到错误;我正在尝试修改我的程序,以便在未来的任何文件中突出显示错误。 – OJW 2013-02-15 18:42:01

+2

没有直接关系,但是您可以只使用'json.load(f)'而不是'json.loads(f.read())' – 2013-02-25 16:02:09

我发现simplejson模块在内置json模块很模糊的很多情况下会给出更多的描述性错误。例如,对于在列表中的最后一项之后具有逗号的情况:

json.loads('[1,2,]') 
.... 
ValueError: No JSON object could be decoded 

这不是非常具有描述性。与simplejson相同操作:

simplejson.loads('[1,2,]') 
... 
simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5) 

好多了!同样适用于其他常见错误,如大写True

+12

Python的未来版本将包含这些改进;这是下面的同一个项目。 – 2013-02-19 13:04:57

+2

http://*.com/questions/718040/how-to-install-simplejson-package-for-python – OJW 2013-02-25 12:14:01

+0

我做了一个简单的更改,让它更加冗长是编辑'/usr/lib/python2.7/json/scanner.py',所以'make_scanner = py_make_scanner'而不是使它等于c_make_scanner。 – paulie4 2015-10-09 16:13:34

你将无法得到python告诉你JSON不正确的地方。您需要在某处使用linter,如this

这会向您显示您尝试解码的JSON中的错误。

+2

是否有脱机工具可以为机密JSON文件执行此操作? – OJW 2013-02-15 18:43:51

+0

@OJW不是我所知道的,但是这应该可以解决您遇到的问题,或者至少让您修复破碎的json。 – myusuf3 2013-02-15 19:12:56

+9

我的JSON文件很好 - 我试图让我的程序打印有用的错误消息,这对任何人都是可以理解的。告诉他们“在第13行第32列消除逗号”是很好的。告诉他们“你的文件中有错误,请上传到互联网,人们会帮你”是不好的。 – OJW 2013-02-15 21:15:37

你可以试试在这里找到的rson库:http://code.google.com/p/rson/。我也在PYPI:https://pypi.python.org/pypi/rson/0.9,所以你可以使用easy_install或pip来获得它。

由汤姆给出的例子:

>>> rson.loads('[1,2,]') 
... 
rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']' 

RSON是一个设计为JSON的超集,所以它可以解析JSON文件。它还有一个替代语法,很多更适合人类查看和编辑。我使用它很多输入文件。

至于布尔值的大写:看起来rson读取不正确的大写布尔值作为字符串。

>>> rson.loads('[true,False]') 
[True, u'False'] 

你可以使用cjson,声称要达到比纯Python实现更快,因为250倍,你有“一些长期复杂的JSON文件”,你可能会需要跑几次(解码器失败并报告他们遇到的第一个错误)。

我有一个类似的问题,这是由于单引号。JSON标准(http://json.org)仅讨论使用双引号,因此它必须是python json库仅支持双引号。

对于我这个问题的特别版本,我继续和packaging.py文件内搜索的load_json_file(path)函数声明,然后偷运一个print线到它:

def load_json_file(path): 
    data = open(path, 'r').read() 
    print data 
    try: 
     return Bunch(json.loads(data)) 
    except ValueError, e: 
     raise MalformedJsonFileError('%s when reading "%s"' % (str(e), 
                   path)) 

这样,它会打印的内容在进入try-catch之前的json文件,就这样 - 即使我几乎没有Python知识 - 我能够快速找出为什么我的配置无法读取json文件。
(这是因为我已经建立了我的文本编辑器编写一个UTF-8 BOM ...愚蠢)

就提这个,因为,虽然可能不是一个好答案OP的具体问题,这是一个相当快速的方法在确定一个非常压抑的错误的来源。我敢打赌,很多人会偶然发现这篇文章,他们正在寻找一个更详细的解决方案的MalformedJsonFileError: No JSON object could be decoded when reading …。所以这可能会帮助他们。

+0

你应该使用上下文管理器来处理文件I/O('with open(fn)as f'),它会为你处理一个例外的文件。 https://en.wikibooks.org/wiki/Python_Programming/Context_Managers#Basic_resource_management – Rebs 2016-11-29 02:59:49

+0

+1。如果你可以展示一个例子,然后将它标准化到标准行为上,那将是相当整洁的 – 2017-04-10 08:41:10

+0

对不起,在找出问题后,我从未触及任何Python代码。也许别人可以帮忙? – WoodrowShigeru 2017-04-13 15:55:59

我有一个类似的问题,这是我的代码:

json_file=json.dumps(pyJson) 
    file = open("list.json",'w') 
    file.write(json_file) 

    json_file = open("list.json","r") 
    json_decoded = json.load(json_file) 
    print json_decoded 

的问题是我忘了file.close()我做到了,解决了这一问题。

+0

也为我效劳,不知道为什么之前没有这个问题。 – pceccon 2016-06-01 19:05:34

+0

您应该使用文件I/O的上下文管理器('open with(fn)as f'),它会为您处理异常情况下的文件。 https://en.wikibooks.org/wiki/Python_Programming/Context_Managers#Basic_resource_management – Rebs 2016-11-29 02:58:59