有效的JSON赢得';t使用pythonjson模块加载

有效的JSON赢得';t使用pythonjson模块加载,python,json,Python,Json,我有来自openWeather的JSON格式的数据,它给出了错误 Traceback (most recent call last): File "testjson.py", line 7, in <module> data = json.load(data_file) File "E:\Program Files\Python27\lib\json\__init__.py", line 290, in load **kw) File "E:\Progra

我有来自openWeather的JSON格式的数据,它给出了错误

Traceback (most recent call last):
  File "testjson.py", line 7, in <module>
    data = json.load(data_file)
  File "E:\Program Files\Python27\lib\json\__init__.py", line 290, in load
    **kw)
  File "E:\Program Files\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "E:\Program Files\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "E:\Program Files\Python27\lib\json\decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
最后是我的Python代码

import json
from pprint import pprint


with open('weather.json') as data_file:    
    data = json.load(data_file)

pprint(data)
我花了好几个小时来处理这件事,在这里和搜索带我去的任何地方寻找线索。与许多更微妙的错误不同,这似乎是在拒绝全部错误,我不知道为什么


有人能解释一下吗?

您需要先从文件中读取数据,然后使用
json
模块加载数据,如下图所示:

import json

with open("weather.json", 'r') as f:
    # read the data
    data = f.read()
    # then load it using json.loads()
    final = json.loads(data)

print(final['city'])
输出:

{u'name': u'Gold Coast', u'country': u'AU', u'coord': {u'lat': -27.97851, u'lon': 153.36055}, u'sys': {u'population': 0}, u'id': 7839581, u'population': 0}
{u'name': u'Gold Coast', u'country': u'AU', u'coord': {u'lat': -27.97851, u'lon': 153.36055}, u'sys': {u'population': 0}, u'id': 7839581, u'population': 0}
编辑:

您还可以使用
json.load()
来完成此任务,如下例所示:

import json

with open("weather.json", 'r') as f:
    final = json.load(f)

print(final['city'])
输出:

{u'name': u'Gold Coast', u'country': u'AU', u'coord': {u'lat': -27.97851, u'lon': 153.36055}, u'sys': {u'population': 0}, u'id': 7839581, u'population': 0}
{u'name': u'Gold Coast', u'country': u'AU', u'coord': {u'lat': -27.97851, u'lon': 153.36055}, u'sys': {u'population': 0}, u'id': 7839581, u'population': 0}
为什么这样工作?很简单,您可以查看输入必须具有的文档
read()
方法:

反序列化fp(a.read()-支持包含 JSON文档)转换为使用此转换表的Python对象

否则,输入中必须是
str
unicode实例

反序列化s(包含JSON文档的str或unicode实例) 使用此转换表创建Python对象


PS:如果两种方法都失败,您应该查看您的文件并检查它是否包含有效的JSON。

OK看起来我的JSON已损坏。读取前三个字符给了他们很高的ASCII ord值,所以我用十六进制编辑器编辑了这个文件,它确实在开始时有3个字符。他们是如何到达那里的完全是个谜,我一直在使用ascii编辑器。感谢您的回复;这真是个奇怪的问题。我现在有一个问题,pprint的输出不是很漂亮,但是我现在可以读取文件并拥有一个字典。非常感谢。

该字符串使用
json.loads
加载,因此您可能需要实际执行
s=data\u file.read()
,然后将其打印出来,并查看
weather.json
的内容是否与您认为的内容相符。看起来不错。你确定源文件没有问题吗?你是否将其传递给JSON检查器,还是只是复制粘贴纯文本?我使用几个在线工具和Chrome JSON插件检查JSON数据。我还发现jq实用程序可以很好地解析它。但是,我还尝试了执行一个s=data_file.read,然后打印字符串:它的开头似乎有3个无法打印的字符。但它们不会出现在文本编辑器中…我很困惑。我可能有点慢,但你推荐的第二种方法似乎正是原问题中失败的方法。是的。这就是为什么我首先使用了
json.loads()
。否则,如果再次失败,OP必须检查他的json文件。对于他当前的json输入,这两种方法都应该可以正常工作。是的,我尝试打开并读取文件,然后对读取的字符串使用loads(),得到了相同的结果。但是,当我打印字符串时,我会得到那些奇怪的字符。对文件使用read(1)并使用ord()得到239187191。也就是说,从文件内容创建字符串时,会将这些字符放在文件的开头。它们不会出现在vi或我的任何其他编辑器中。因此,json文件可能有一些错误,但正如我所说的,jq解析它,所有在线的lint Checker都认为它是好的,这就是它的原貌。我不知道他们的存在,很好的电话。我只是从浏览器窗口复制并粘贴json,不知何故,标记被插入了这个过程中。干杯我不确定关于这个项目的协议。问题的根本原因与Python或JSON无关,可能使该项超出范围;然而,其他人可能会发现自己也有同样的问题。这是由我的文本编辑器Emeditor和它处理编码的方式引起的。我以前从未注意到它,因为BOM是不可见的。我在工作中也使用了vi,它也没有显示BOM字符。Emeditor中有一个无需签名即可保存的选项,这将解决此问题。