gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:45 25 4
gpt4 key购买 nike

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

我通过以下方式调用 gsettings:

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

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

ignore = json.loads(stdout.strip("\n"))

但是,这会抛出一个 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

为什么 ignore_hosts_fails 在不交换引号类型的情况下无法被 json.loads 成功解析?

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

最佳答案

来自JSON RFC 7159 :

  string = quotation-mark *char quotation-mark

[...]

  quotation-mark = %x22      ; "

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

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

>>> import ast
>>> ast.literal_eval("['localhost', '127.0.0.0/8']")
['localhost', '127.0.0.0/8']

关于python - 为什么 json.loads 关心使用哪种类型的引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28464851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com