而不是(来自json.dumps
):
[
{
"created": 581937573,
"text": "asdf"
},
{
"created": 581937699,
"text": "asdf"
}
]
我想获得这个[非JSON]输出:
[
{
created: 581937573,
text: "asdf"
},
{
created: 581937699,
text: "asdf"
}
]
如果json.dumps
有更改键的引号字符的选项,我可以将其设置为占位符并稍后将其删除。不幸的是,它似乎没有这个选项...还有其他聪明的想法吗?
(从这种格式加载不是必需的,但如果它的解决方案也存在则会很有趣)
答案 0 :(得分:4)
re.sub
在某些假设下提供快速解决方法:
import re
data = [...]
json_data = json.dumps(data)
with open('file.txt', 'w') as f:
f.write(re.sub(r'"(.*?)"(?=:)', r'\1', json_data))
file.txt
[
{
created: 581937573,
text: "asdf"
},
{
created: 581937699,
text: "asdf"
}
]
这些假设是
re.sub
在合理的时间内运行该模式有效地查找所有字典键并删除引号。
答案 1 :(得分:0)
如果@cs95 的解决方案在您的情况下不起作用(例如,您的值中有额外的 "
),那么您可以使用 jsonnetfmt
工具来执行此操作。这是一种解决方法,但效果很好。
jsonnetfmt
将其格式化为 jsonnet,在这种情况下恰好是 OP 想要的。可以稍微配置一下,运行jsonnetfmt --help
检查一下。
(请注意以下示例中的额外逗号,这是此方法的副作用)
安装步骤:
go
jsonnetfmt
:go get github.com/google/go-jsonnet/cmd/jsonnetfmt
运行步骤:
将 json 保存到文件中。
在此文件上运行 jsonnetfmt
。
读取文件。
with open('json_file.json', 'w', encoding='utf8') as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
from subprocess import run
run('jsonnetfmt json_file.json --in-place')
with open('json_file.json', 'r', encoding='utf8') as f:
json_output= f.read()
之前:
[
{
"created": 581937573,
"text": "asdf"
},
{
"created": 581937699,
"text": "asdf"
}
]
之后:
[
{
created: 581937573,
text: 'asdf',
},
{
created: 581937699,
text: 'asdf',
},
]
添加 --string-style d
后:
[
{
created: 581937573,
text: "asdf",
},
{
created: 581937699,
text: "asdf",
},
]