如何在不引用键的情况下转储类似json的字符串?

时间:2018-06-10 21:10:36

标签: python json python-3.x

而不是(来自json.dumps):

[
  {
    "created": 581937573,
    "text": "asdf"
  },
  {
    "created": 581937699,
    "text": "asdf"
  }
]

我想获得这个[非JSON]输出:

[
  {
    created: 581937573,
    text: "asdf"
  },
  {
    created: 581937699,
    text: "asdf"
  }
]

如果json.dumps有更改键的引号字符的选项,我可以将其设置为占位符并稍后将其删除。不幸的是,它似乎没有这个选项...还有其他聪明的想法吗?

(从这种格式加载不是必需的,但如果它的解决方案也存在则会很有趣)

2 个答案:

答案 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"
  }
]

这些假设是

  1. 您的数据足够小,re.sub在合理的时间内运行
  2. 您的数据不包含字符串值,这些字符串值本身包含的内容可能与我在此处使用的模式相匹配。
  3. 该模式有效地查找所有字典键并删除引号。

答案 1 :(得分:0)

如果@cs95 的解决方案在您的情况下不起作用(例如,您的值中有额外的 "),那么您可以使用 jsonnetfmt 工具来执行此操作。这是一种解决方法,但效果很好。

jsonnetfmt 将其格式化为 jsonnet,在这种情况下恰好是 OP 想要的。可以稍微配置一下,运行jsonnetfmt --help检查一下。

(请注意以下示例中的额外逗号,这是此方法的副作用)

安装步骤:

  1. 安装go
  2. 通过运行安装 jsonnetfmt
go get github.com/google/go-jsonnet/cmd/jsonnetfmt

运行步骤:

  1. 将 json 保存到文件中。

  2. 在此文件上运行 jsonnetfmt

  3. 读取文件。

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",
  },
]