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

时间:2018-06-20 12:01:15

标签: python json regex

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

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

    {      
Name: "test",
Address: "xyz",
"Age": 40,
"Info": "test"
}

必填:

    {      
"Name": "test",
"Address": "xyz",
"Age": 40,
"Info": "test"
}

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

s = "Example: String"
out = re.findall(r'\w+:', s)

How to Escape Double Quote inside JSON

6 个答案:

答案 0 :(得分:4)

使用正则表达式:

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

输出:

{ "Name": "test", "Address": "xyz"}

答案 1 :(得分:1)

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

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

此外,以上内容将排除日期时间戳记中带有:(冒号)的双引号。

答案 2 :(得分:0)

regex方法可能很脆弱。我建议您找到一个可以解析缺少引号的JSON文本的库。

例如,在Kotlin 1.4中,解析JSON字符串的标准方法是使用Json.decodeFromString。但是,您可以使用Json { isLenient = true }.decodeFromString放宽报价要求。这是JUnit中的完整示例。

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test

@Serializable
data class Widget(val x: Int, val y: String)

class JsonTest {

    @Test
    fun `Parsing Json`() {
        val w: Widget = Json.decodeFromString("""{"x":123, "y":"abc"}""")
        Assertions.assertEquals(123, w.x)
        Assertions.assertEquals("abc", w.y)
    }

    @Test
    fun `Parsing Json missing quotes`() {
        // Json.decodeFromString("{x:123, y:abc}") failed to decode due to missing quotes
        val w: Widget = Json { isLenient = true }.decodeFromString("{x:123, y:abc}")
        Assertions.assertEquals(123, w.x)
        Assertions.assertEquals("abc", w.y)
    }
}

答案 3 :(得分:0)

您可以使用在线格式化程序。我知道他们中的大多数人都因为没有双引号而引发错误,但是如果将双引号以下的话似乎处理得很好!

JSON Formatter

答案 4 :(得分:0)

您可以使用PyYaml。由于JSON是Yaml的子集,因此pyyaml可以克服引号的不足。

示例

import yaml

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

答案 5 :(得分:-1)

使用JSON5.parse,然后使用JSON.stringify

(请注意解析调用中的“ 5”)

  1. 您的输入数据有效JSON5,因此JSON5.parse会将其正确解析为Javascript对象。如果只需要该对象,请在此处停止。
  2. 使用JSON.stringify将其放回字符串形式,这次以标准JSON格式。