如何在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.loadjson.loads 之间的区别

【讨论】:

以上是关于如何在python中转储不带引号的json的主要内容,如果未能解决你的问题,请参考以下文章

python:解析js中常见的 不带引号的key的 json

转储到 JSON 添加额外的双引号和引号转义

如何在不使用转储的情况下在 python 中编写 json 文件

如何将不带引号的嵌套字符串字典转换为Python中的字典

转储到另一个文件时如何删除引号?

如何格式化 YAML 以包含括号作为不带引号的值之一