我正在阅读多个json_file
并将其存储在json_text
中,如下所示:
json_text = json_file.read()
当我print
json_text
时,我会收到以下信息:
{
"speech": {
"text": "<p>Lords</p><p>We are all in the same boat</p><p>It is time for us to help</p>",
"id": null,
"doc_id": null,
"fave": "N",
"system": "2015-09-24 13:00:17"
}
}
<type 'str'>
我假设我会使用json.loads()
将其作为词典,但这不起作用:
ValueError:无法解码JSON对象
显然loads()
并未将json_text
标识为JSON,即使根据http://jsonlint.com它是有效的JSON所以我认为我会使用dump()
然后{ {1}}:
loads()
给出:
json_dumps = json.dumps(json_text)
json_loads = json.loads(json_dumps)
print json_loads, type(json_loads)
我也尝试在{
"speech": {
"text": "<p>Lords</p><p>We are all in the same boat</p><p>It is time for us to help</p>",
"id": null,
"doc_id": null,
"fave": "N",
"system": "2015-09-24 13:00:17"
}
}
<type 'unicode'>
上使用ast
和literal_eval()
,但后来我得到了:
ValueError:格式错误的字符串
因此。场景是我在一个文件夹中有多个json文件。我想加载这些文件并获取特定密钥并将其存储在json_text
pandas
中。我试过DataFrame
,但它只是告诉我pd.read_json()
有问题。
这是我的代码:
json
给予path_to_json = 'folder/'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
for index, js in enumerate(json_files):
with open(os.path.join(path_to_json, js)) as json_file:
json.load(json_file)
因此我尝试使用ValueError: No JSON object could be decoded
et.c。
答案 0 :(得分:1)
正如我在评论中提到的,如果编码不是基于ASCII的,它也会导致ValueError
。例如,以下json.loads
失败:
>>> json.loads(u'{"id": null}'.encode("utf16"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/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
您可以查看编码的一种方法是print(repr(json_text))
,它可以显示其他字节(如UTF-16):
>>> print(repr(u'{"id": null}'.encode("utf16")))
'\xff\xfe{\x00"\x00i\x00d\x00"\x00:\x00 \x00n\x00u\x00l\x00l\x00}\x00'
json.load
和json.loads
在Python 2中都支持编码参数。但这仅适用于基于ASCII的编码,因此对于UTF-16,您可以获得相同的ValueError
:
>>> json.loads(u'{"id": null}'.encode("utf16"), encoding="utf16")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/json/__init__.py", line 352, in loads
return cls(encoding=encoding, **kw).decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/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_text = json_text.decode("utf16")
或者您可以使用codecs.open
加载文件:
with codecs.open(json_file_name, "r", encoding="utf16") as f:
print(json.load(f))
# or
# json_text = f.read()
(请注意,我在这里使用的是UTF-16,但对您而言可能不是这样)
从你的JSON文本看,字符本身都是ASCII字符,因此任何基于ASCII的编码(例如latin-1)仍然可以在没有任何解码的情况下工作,因为用ASCII,UTF8或拉丁语编码的JSON内容之间没有区别-1
作为附注,您将文本转储并加载,然后返回unicode
个对象。理论上(如果我的答案是正确的)你应该能够实际加载json_loads
(又名json.loads(json_loads)
)。
答案 1 :(得分:0)
不确定你的错误是什么。我可以使用此代码按预期运行:
import json
strdata = """
{
"speech": {
"text": "<p>Lords</p><p>We are all in the same boat</p><p>It is time for us to help</p>",
"id": null,
"doc_id": null,
"fave": "N",
"system": "2015-09-24 13:00:17"
}
}
"""
data = json.loads(strdata)
print(data)
答案 2 :(得分:0)
这似乎是一个编码问题,也许已经是从文件中读取。您应该在json.loads中使用适当的编码作为参数。