Python:如何在不使用双引号的情况下修复JSON键值?

mss*_*nse 2 python regex json

我目前有以下格式的JSON。一些键值的格式不正确,因为它们缺少双引号(“)

如何修复这些键值以使其带有双引号?

    {      
Name: "test",
Address: "xyz",
"Age": 40,
"Info": "test"
}
Run Code Online (Sandbox Code Playgroud)

需要:

    {      
"Name": "test",
"Address": "xyz",
"Age": 40,
"Info": "test"
}
Run Code Online (Sandbox Code Playgroud)

使用下面的文章,我能够在上面的INVALID JSON中找到这样的键值。但是,我找不到用双引号替换这些找到的值的有效方法。

s = "Example: String"
out = re.findall(r'\w+:', s)
Run Code Online (Sandbox Code Playgroud)

如何在JSON中转义双引号

hec*_*nto 8

您可以使用 PyYaml。由于 JSON 是 Yaml 的子集,因此 pyyaml 可以克服缺少引号的问题。

例子

import yaml

dirty_json = """
     {
  key: "value",
  "key2": "value"
}
"""
yaml.load(dirty_json, yaml.SafeLoader)

Run Code Online (Sandbox Code Playgroud)


Rak*_*esh 6

使用正则表达式:

import re
data = """{ Name: "test", Address: "xyz"}"""
print( re.sub("(\w+):", r'"\1":',  data) )
Run Code Online (Sandbox Code Playgroud)

输出:

{ "Name": "test", "Address": "xyz"}
Run Code Online (Sandbox Code Playgroud)

  • 这种正则表达式方法非常不安全。它将改变恰好包含冒号的值。请参阅我的答案以获得安全的解决方案。 (2认同)

Jay*_*kla 6

您可以使用在线格式化程序。我知道他们中的大多数人都会因为没有双引号而抛出错误,但下面的一个似乎处理得很好!

JSON 格式化程序


mss*_*nse 5

我在 JSON 中遇到了一些其他问题。想到分享对我有用的最终解决方案。

jsonStr = re.sub("((?=\D)\w+):", r'"\1":',  jsonStr)
jsonStr = re.sub(": ((?=\D)\w+)", r':"\1"',  jsonStr)
Run Code Online (Sandbox Code Playgroud)
  1. 第一行将解决密钥的双引号问题。即 名称:“测试”
  2. 第二行将修复该值的双引号问题。即“信息”:测试

另外,上面将排除日期时间戳内的双引号,其中包含:(冒号)。