我目前具有以下格式的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)
答案 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)
此外,以上内容将排除日期时间戳记中带有:(冒号)的双引号。
答案 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)
您可以使用在线格式化程序。我知道他们中的大多数人都因为没有双引号而引发错误,但是如果将双引号以下的话似乎处理得很好!
答案 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”)
JSON5.parse
会将其正确解析为Javascript对象。如果只需要该对象,请在此处停止。JSON.stringify
将其放回字符串形式,这次以标准JSON格式。