【问题标题】:How to Fix JSON Key Values without double-quotes?如何在没有双引号的情况下修复 JSON 键值?
【发布时间】:2018-11-29 13:26:24
【问题描述】:

我目前有以下格式的 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

【问题讨论】:

  • 每次都是行首的键吗?
  • 不,Jean,有几把钥匙藏在中间。我无权更改源格式。因此,必须在我的最后处理它。

标签: python json regex


【解决方案1】:

使用正则表达式:

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

输出:

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

【讨论】:

  • 这种正则表达式方法非常不安全。它将改变碰巧包含冒号的值。请参阅我的答案以获得安全的解决方案。
【解决方案2】:

我在 JSON 中遇到了更多问题。 想到分享对我有用的最终解决方案。

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

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

【讨论】:

  • 它对我来说效果很好,包括时间戳包含 : 但它在 json 数据中的另一个键值对中失败的情况,其中 value 包含 : 。例如地址:“2600:0000:cf02:ff64:0000:0000:345e:e820”。此正则表达式将此值转换为地址":\"2600:0000:"cf02":4"e3f":7"c7a":2887:97"c9":40cd\"。
【解决方案3】:

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

JSON Formatter

【讨论】:

  • 我印象深刻,它是少数接受无效 JSON 作为输入的工具之一
【解决方案4】:

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

例子

import yaml

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

【讨论】:

    【解决方案5】:

    正则表达式方法可能很脆弱。我建议你找一个可以解析缺少引号的 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)
        }
    }
    

    【讨论】:

    • 虽然您是正确的,正则表达式对于解析 JSON 等递归结构可能很脆弱,但这个问题是关于 Python,而不是 Kotlin。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多