将字符串转换为dict

时间:2016-10-28 10:37:47

标签: python json

我正在阅读多个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'> 上使用astliteral_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。

3 个答案:

答案 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.loadjson.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中使用适当的编码作为参数。