regex 如何修复没有双引号的JSON键值?

3xiyfsfu  于 2023-03-20  发布在  其他
关注(0)|答案(5)|浏览(160)

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

vddsk6oq

vddsk6oq1#

使用正则表达式:

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

输出:

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

wnrlj8wa2#

可以使用PyYaml,因为JSON是Yaml的子集,所以pyyaml可以克服引号的不足。
示例

import yaml

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

lvmkulzt3#

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

jsonStr = re.sub("((?=\D)\w+):", r'"\1":',  jsonStr)
jsonStr = re.sub(": ((?=\D)\w+)", r':"\1"',  jsonStr)

1.第一行将修复键的双引号问题,即Name:“试验”
1.第二行将修复值的双引号问题,即“Info”:测试
此外,上述内容将排除日期时间戳内的双引号,其具有:(冒号)在它们里面。

yvgpqqbh

yvgpqqbh4#

你可以使用在线格式器。我知道他们中的大多数都是抛出错误没有双引号,但下面一个似乎处理得很好!
JSON Formatter

xqk2d5yq

xqk2d5yq5#

regex方法可能很脆弱,我建议您找一个可以解析缺少引号的JSON文本的库。
例如,在Kotlin1.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)
    }
}

相关问题