【问题标题】:Put missing double quotes in a JSON string value in java在java中将缺少的双引号放在JSON字符串值中
【发布时间】:2020-06-25 14:45:21
【问题描述】:

我有一个 json 字符串,其中所有值都需要用双引号括起来。例如(只是一个示例,它包含许多相似的字段)

    {"Id": "2017",
     "Currency": "AUD",
     "Date": 2020-06-22,
     "InCash": 0.000, 
     "Dep": "ABC90",
     "sumCash": 770.87,
     "AnotherDate": 2020-06-21}

     {"Id": "2017",
     "Currency": "AUD",
     "Date": "2020-06-22",
     "startCash": "0.000", 
     "Dep": "ABC90",
     "sumCash": "770.87",
     "AnotherDate": "2020-06-21"}
        

我正在尝试使用正则表达式,但它破坏了“日期”字段。

jsonString.replaceAll(":[ ]*([\\w@\\.]+)", ": \"$1\"")

也尝试使用 gson 库,但它只将引号放在日期值上而不是十进制值上。

new JsonParser().parse(jsonString).toString()

我需要做什么才能实现它?

【问题讨论】:

  • 字符串从何而来?鉴于这不是有效的 JSON,您是否可以尝试从源头修复它而不是稍后应用“修复”?除此之外,通过这种方式,发起者可以选择是否某些东西以字符串形式结束——例如,0.000 和 770.87 可能故意为非字符串值(而 2020-06-22 是错误的)。
  • @JonSkeet 它是一个来自 kafka 主题的固定格式 Avro 对象,KStream
  • 我对 Avro 知之甚少,但是有什么东西可以将它从 Avro 格式转换为 JSON 吗?因为如果是这样,它显然做得很糟糕,我认为这值得作为一个错误报告。
  • 不知道它叫什么JSON,它真的是一个非常简单的结构,对象{}包含键值对,其中值可以是字符串,或数字,或数组(值列表),或对象,或真、假或空。在 PCRE 中为其编写正则表达式非常简单,但 java 没有函数调用(即递归)。但是对于 yuior 所做的事情,不解析 JSON,不需要递归。说JSON 大错特错了,一些厄运者没有opshuns,而是一个真正的PARSER,但是一个笑话导致它如此简单

标签: java json regex string gson


【解决方案1】:

看看这个

var newS = jsonString.replaceAll(": +((?!\\\\).*)(!?[,|}] *)", ": \"$1\"$2").replaceAll("\\\"\\\"","\"");

输出

{
  "Id": "2017",
  "Currency": "AUD",
  "Date": "2020-06-22",
  "InCash": "0.000",
  "Dep": "ABC90",
  "sumCash": "770.87",
  "AnotherDate": "2020-06-21"
}

【讨论】:

  • 不工作。我用这个 replaceAll(": [ ]*([\\w@\\.-]+)", ": \"$1\"") 修复了它
【解决方案2】:

如果 yuior 字符串的其他 JSON 形式(规则)没有改变,这将适用于
名称 - 值形式。
注意 - 我没有做它可能是 list 中的字符串的部分,但它是可行的 alsero

查找:
("\s*\w+\s*"\s*:(?!\s*")(?!\s*\d+\s*(?:,|\]|}))(?!\s*[{\[])(?!\s*(?:true|false|null)\s*(?:,|\]|}))\s*)(.+?)(?=[,}])
替换:
$1"$2"

demo

请参阅我完整的 PCRE 正则表达式,以解析 JSON 一个非常简单的结构规范。
这里 https://regex101.com/r/H8datD/1 在正则表达式引擎使用递归(函数)之前对 java 不可用。

注意 - 当只需要更改 JSON 的一个方面时,它符合规范结构
很容易在我的正则表达式中提取代码以直接进入感兴趣的区域。很简单!

【讨论】:

    【解决方案3】:

    可以使用下面的正则表达式。

    jsonString.replaceAll(": [ ]*([\\w@\\.-]+)", ": \"$1\""));
    

    感谢大家的帮助和支持!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2017-08-15
      • 2021-11-16
      • 1970-01-01
      • 2017-03-02
      • 2018-05-06
      相关资源
      最近更新 更多