如何在没有双引号的情况下修复 JSON 键值?
Posted
技术标签:
【中文标题】如何在没有双引号的情况下修复 JSON 键值?【英文标题】:How to Fix JSON Key Values without double-quotes? 【发布时间】: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,有几把钥匙藏在中间。我无权更改源格式。因此,必须在我的最后处理它。 【参考方案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)
-
第一行将解决密钥的双引号问题。 IE。
名称:“测试”
第二行将修复该值的双引号问题。即“信息”:测试
此外,上面将排除日期时间戳中的双引号,其中包含:(冒号)。
【讨论】:
它对我来说效果很好,包括时间戳包含 : 但它在 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。以上是关于如何在没有双引号的情况下修复 JSON 键值?的主要内容,如果未能解决你的问题,请参考以下文章