【问题标题】:How to convert an invalid json into a valid json so that it could be parsed如何将无效的 json 转换为有效的 json 以便对其进行解析
【发布时间】:2021-08-03 12:58:43
【问题描述】:

我有一个来自前端的无效 json,我无法控制。 json是这样的:

{
    "assetClassDetails":[{}],
    "assetClassRequired":null,
    "baseUnitofMeasure":"PMI",
    "bomParent":"Yes",
    "commodityCodeTaric":"84158200",
    "enLanguageKey":"EN",
    "enMaterialLongText":"Lenovo Privacy Filter for 14" Notebooks ( L, T and X1 Carbon)"",
    "grossWeightInKg":null,
    "height":null,
    "heightLengthWidthUnit":null,
    "length":null,"manufacturerPartNumber":"",
    "materialLongDescription":"Lenovo Privacy Filter for 14" Notebooks ( L, T and X1 Carbon)"",
    "physicalCategory":"Physical",
    "volume":null,
    "volumeUnit":null,
    "width":null,
    "xxLanguageKey":null,
    "xxMaterialLongText":null
 }

Pl。查看 enMaterialLongText 和 materialLongDescription。我决定将整个字符串拆分为逗号字符。但是这里的逗号不仅是键值对分隔符,它也存在于某些值中。所以我使用了这样的正则表达式:

test = test.replaceAll("(,)[\\s]*([^\"])", "_COMMA_ $2");

这行得通。现在我需要另一个正则表达式,以便可以将嵌套引号转换为字符串,例如“QUOTE”。在 Gson 将 json 解析为 java 对象后,我可以将 enMaterialLongText 和 materialLongDescription 等属性转换为转义引号。

【问题讨论】:

  • 如果你的无效 JSON 格式是这样的,每个键值在它自己的行上,你可以使用String result = Pattern.compile("(?<=\":\").*(?=\")").matcher(text).replaceAll(x -> x.group().replace("\"", "_QUOTE_") );
  • @WiktorStribiżew 我使用的是 java 8,它是 Matcher.replaceAll 直到 java 9 才采用功能接口。你能建议我如何为 java 8 修改它。

标签: java json regex


【解决方案1】:

如果键和值未按照问题中的格式任意设置,则无法自行修复 JSON,它应该在提供者方面进行修复。

假设键值对位于您可以使用的不同行

StringBuffer fixedJSON = new StringBuffer();
Matcher m = Pattern.compile("(?<=\":\").*(?=\")").matcher(text);
while (m.find()) {
    m.appendReplacement(fixedJSON, m.group().replace("\"", "_QUOTE_"));
}
m.appendTail(fixedJSON);
System.out.println(fixedJSON.toString()); 

(?&lt;=\":\").*(?=\") 正则表达式匹配位于 ":" 之后直到最后一个 " 的值,如下所示:

  • (?&lt;=\":\") - 一个正向的后视,需要在当前位置的左侧紧邻 ":"
  • .* - 除换行符以外的任何零个或多个字符尽可能多
  • (?=\") - 正向前瞻,需要在当前位置的右侧紧邻 "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2018-05-27
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多