如何在Python中以无引号的形式输出JSON?

23

以下是我如何转储文件的方法

with open('es_hosts.json', 'w') as fp:
  json.dump(','.join(host_list.keys()), fp)

结果是

 "a,b,c"

我希望:

 a,b,c

谢谢


4
你为什么认为你想要的输出是有效的JSON?为什么你需要它没有引号? - Martijn Pieters
我知道...但这是一个特殊情况的一部分,在输出中我不需要引号。 - Tampa
@MartijnPieters OP并没有建议直接使用未引用的字符串作为JSON。我最近遇到了类似的情况,其中双引号稍后在过程中添加,因此我需要未引用但已转义为JSON的字符串。 - Andreas Maier
@AndreasMaier:那是完全不同的情况。 - Martijn Pieters
@MartijnPieters 再次考虑,你的问题现在似乎更合适了。写一个扩展名为“.json”的文件似乎表明了这一点。 - Andreas Maier
1
如果你想读取一个json文件并将其中的一部分转储到磁盘上(即:保存它而不是保存为json文件),那么使用write可能比使用dump更有意义,例如fp.write(mydata) - Fabien Snauwaert
5个回答

20

在进行字符串替换之前,您可能想要去除引号:strip

print '"a,b,c"'.strip('"')

输出:

a,b,c

这更接近你想要实现的目标。即使只是删除第一个和最后一个字符也可以: '"a,b,c"'[1:-1]

但是你看过这个问题吗?


1
这个解决方案比建议替换所有双引号的解决方案更好,但是当(未引用的)字符串的最后一个字符是(转义的)双引号时,它仍然会删除太多内容,例如 "my name is \"Andy\""。你希望的是只删除开头和结尾的双引号。 - Andreas Maier
我应该补充说明,我的评论适用于答案中提出的第一种解决方案(使用strip())。第二种解决方案(使用切片)适用于所有情况(并且应该有自己的答案以便投票)。仍然支持此答案。 - Andreas Maier

9

如果您只想删除keys中的引号,这可能很重要,因为您稍后可能会对其进行解析(假设使用某些宽容的解析器或者仅出于奇怪的原因直接将其导入node),您可以尝试以下正则表达式。

re.sub(r'(?<!: )"(\S*?)"', '\\1', json_string)

一个问题是这个正则表达式期望字段被分隔为key: value,对于key:value的格式将不能匹配。你可以通过微小的修改让它能够匹配后者,但同样它也不能匹配:之后有可变数量空格的情况。

虽然它能够处理json.dumps输出的结果,但是这些结果无法被json解析。一些更加宽容的解析器,如yaml,可能能够读取这些结果。

import re
regex = r'(?<!: )"(\S*?)"'
o = {"noquotes" : 127, "put quotes here" : "and here", "but_not" : "there"}
s = json.dumps(o)
s2 = json.dumps(o, indent=3)
strip_s = re.sub(regex,'\\1',s)
strip_s2 = re.sub(regex,'\\1',s2)

print(strip_s)
print(strip_s2)

assert(json.loads(strip_s) == json.loads(s) == json.loads(strip_s2) == json.loads(s2) == object)

会引发一个ValueError,但会打印出您想要的内容。


1
使用Python内置的字符串替换函数。
with open('es_hosts.json', 'w') as fp:
   json.dump(','.join(host_list.keys()).replace('\"',''), fp)

3
此解决方案还会去除字符串中的双引号。 - Andreas Maier

1

那不是有效的JSON,所以json模块无法帮助你编写该数据。但你可以这样做:

import json

with open('es_hosts.json', 'w') as fp:
    data = ['a', 'b', 'c']
    fp.write(json.dumps(','.join(data)).replace('"', ''))

那是因为你请求的是 json,但实际上不是 json 格式,这个应该就够用了:
with open('es_hosts.json', 'w') as fp:
    data = ['a', 'b', 'c']
    fp.write(','.join(data))

0

只需使用for循环将列表分配给字符串。

import json

with open('json_file') as f:
    data = json.loads(f.read())
    for value_wo_bracket in data['key_name']:
        print(value_wo_bracket)

请注意,json.loadjson.loads之间存在差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接