为什么 json.loads 关心使用哪种类型的引号?

McM*_*nip 1 python string json python-2.7

在 python 脚本中,我正在解析它的返回,
gsettings get org.gnome.system.proxy ignore-hosts
它看起来应该是正确格式化的JSON
['localhost', '127.0.0.0/8']
但是,当将此输出传递给json.loads 时,它会抛出
ValueError: No JSON object could be decoded

我通过以下方式调用 gsettings:

import subprocess
proc = subprocess.Popen(["gsettings", "get", "org.gnome.system.proxy", "ignore-hosts"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
stdout,stderr = proc.communicate()
Run Code Online (Sandbox Code Playgroud)

分配"['localhost', '127.0.0.0/8']\n"stdout. 然后我去掉换行符并传递给 json.loads:

ignore = json.loads(stdout.strip("\n"))
Run Code Online (Sandbox Code Playgroud)

但是,这会抛出一个ValueError.

我已将问题追溯到由单引号或双引号定义的字符串,如以下代码段所示:

# tested in python 2.7.3

import json

ignore_hosts_works = '["localhost", "127.0.0.0/8"]'
ignore_hosts_fails = "['localhost', '127.0.0.0/8']"

json.loads(ignore_hosts_works) # produces list of unicode strings
json.loads(ignore_hosts_fails) # ValueError: No JSON object could be decoded

import string
table = string.maketrans("\"'", "'\"")

json.loads(string.translate(ignore_hosts_fails, table)) # produces list of unicode strings
Run Code Online (Sandbox Code Playgroud)

为什么不交换引号类型就ignore_hosts_fails不能成功解析json.loads

以防万一,我正在使用 Python 2.7.3 运行 Ubuntu 12.04。

Mar*_*ers 5

来自JSON RFC 7159

  string = quotation-mark *char quotation-mark
Run Code Online (Sandbox Code Playgroud)

[...]

  quotation-mark = %x22      ; "
Run Code Online (Sandbox Code Playgroud)

JSON 字符串必须使用"引号。

您可以使用以下命令将该列表解析为 Python 文字ast.literal_eval()

>>> import ast
>>> ast.literal_eval("['localhost', '127.0.0.0/8']")
['localhost', '127.0.0.0/8']
Run Code Online (Sandbox Code Playgroud)