【问题标题】:Non Json Format to JSON format非 JSON 格式转 JSON 格式
【发布时间】:2012-02-29 10:26:07
【问题描述】:

我有一个字符串,它“几乎”是一个 json 字符串,只是它的键没有被引号包围。 通常它由 UI 和 javascript 使用,在解释它时没有问题。但是,我所知道的 Java 中的 JSON 解析器似乎需要用引号括起来的键。

有没有办法可以将字符串转换为有效的 json 字符串,可能是通过在 Java 中使用正则表达式。 或者是否有一个有点宽松的 JSON 库。

字符串的格式为

{
   A : "Val1", 
   B : [ SOME NESTED STUFF], 
   C : "Val3"
}

我需要把它转换成

{
   "A" : "Val1", 
   "B" : [ SOME NESTED STUFF], 
   "C" : "Val3"
}

不影响任何嵌套的东西。 A、B、C键的个数是固定的。

谢谢

附:我无法将适当的 JSON 字符串返回给我,这是一个预先存在的代码,更改它是非常危险的。

【问题讨论】:

  • 是否保证 Val1 和 Val3 不包含双引号?
  • ([^"]\\w+[^"]?): ...这只是我的想法,但应该为您指明正确的方向。想法是从冒号返回,因为您知道您正在寻找一个或多个在冒号前没有被引用的单词字符。
  • 谢谢大家...我开始使用 json-smart,它在解析 json 时很宽松,并且不需要密钥有引号。 code.google.com/p/json-smart

标签: java regex json


【解决方案1】:

如果您碰巧使用 Jackson,它支持非标准 JSON,包括不带引号的键:http://www.cowtowncoder.com/blog/archives/2009/08/entry_310.html

【讨论】:

【解决方案2】:

如果您确定以    unquoted_word : 开头的所有行都需要引用该单词,您可以使用类似的内容:

str.replaceAll("(?m)^(\s+)(\w+)(\s*:)", "$1\"$2\"$3");


但是,如果可以的话,最好像其他答案建议的那样使用适当的解析器。

【讨论】:

    【解决方案3】:

    如果你真的想要一个正则表达式,这可能有效:

    jsonString.replaceAll("(\\w+)\\s*\\:","\"$1\" :");
    

    也就是说,如果您真的担心接触嵌套的东西和极端情况,您需要一个真正的解析器,而不是正则表达式。如果您的值之一是字符串" A : ",则正则表达式不可能足够精确以避免混乱。如果 pingw33n 关于 jackson 解析器是正确的,那么它是迄今为止最好的答案。

    【讨论】:

      【解决方案4】:

      使用以下行代码将所有键(单个大写字母在此视为有效键)用双引号括起来:

      str = str.replaceAll("\s([A-Z])\s\:\s\"", "\"$1\" : ");
      

      【讨论】:

      • 中断{ A : " B : C "}
      • 如果您像这样更新,它将起作用 s.replaceAll("\\s([AZ])\\s+([\\:\"])", "\"$1\" $2")
      • 我什至没有考虑未转义的反斜杠。即使它们被修复,表达式仍然会在字符串包含 " (some letter) :" 时搞砸。
      • @cHao:确实……我没有考虑到这一点……我编辑了我的答案,通过在正则表达式字符串的末尾添加\" 来解决这个问题
      • @BigFatBaby:如众神所愿,使用正确的 JSON 和 JSON 解析器。或者 JS 和eval。但是任何一个都远远超过了正则表达式的能力。正则表达式的能力非常有限;你走那条路,用不了多久你就会沮丧地扯掉你的头发。
      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多