如何在python中转储不带引号的json
Posted
技术标签:
【中文标题】如何在python中转储不带引号的json【英文标题】:How to dump json without quotes in python 【发布时间】:2014-10-26 00:56:46 【问题描述】:这是我转储文件的方式
with open('es_hosts.json', 'w') as fp:
json.dump(','.join(host_list.keys()), fp)
结果是
"a,b,c"
我想要:
a,b,c
谢谢
【问题讨论】:
是什么让你认为你想要的输出是有效的 JSON?为什么不需要引号? 我知道......但是在我不需要输出中的引号的极端情况下 @MartijnPieters OP 并未建议将未加引号的字符串直接用作 JSON。我最近遇到了类似的情况,在这个过程中稍后会添加双引号,所以我需要未加引号但 JSON 转义的字符串。 @AndreasMaier:情况完全不同。 如果你想读取一个 json 文件并将它的一部分转储到磁盘(即:保存它而不保存的文件是 json),那么使用write
可能比使用dump
更有意义,例如fp.write(mydata)
.
【参考方案1】:
在进行字符串替换之前,您可能需要strip
引号:
print '"a,b,c"'.strip('"')
输出:
a,b,c
这更接近您想要实现的目标。即使只是删除第一个和最后一个字符也可以:'"a,b,c"'[1:-1]
。
但是你看过this question吗?
【讨论】:
此解决方案比建议替换所有双引号的解决方案要好,但是当(未加引号的)字符串的最后一个字符是(转义的)双引号时,它仍然删除了太多,如@ 987654326@。您想要的是仅删除前导双引号和尾随双引号。 我应该补充一点,我的评论适用于答案中建议的第一个解决方案(使用strip()
)。第二种解决方案(使用切片)适用于所有情况(并且应该有自己的答案,因此可以投票)。仍在投票赞成这个答案。【参考方案2】:
仅删除 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
,但会打印您想要的内容。
【讨论】:
【参考方案3】:嗯,这不是有效的 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))
【讨论】:
【参考方案4】:使用python内置的字符串替换功能
with open('es_hosts.json', 'w') as fp:
json.dump(','.join(host_list.keys()).replace('\"',''), fp)
【讨论】:
此解决方案也删除了字符串中的双引号。【参考方案5】:只需使用 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.load
和json.loads
之间的区别
【讨论】:
以上是关于如何在python中转储不带引号的json的主要内容,如果未能解决你的问题,请参考以下文章
python:解析js中常见的 不带引号的key的 json