【发布时间】: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 修改它。