如何在没有双引号的情况下修复 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 键值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有双引号的情况下生成光滑的查询?

如何使用 python 从 youtube v3 api 修复 json?

如何在没有“键值”对格式的情况下快速发送 json 对象

如何在不输入双引号的情况下制作搜索栏?

如何在ios中将字典的双引号数组解析为json?

printf() 在没有双引号的情况下工作,打印随机字符 [重复]