Java 如何将无效的json转换为有效的json,以便对其进行解析
我有一个来自前端的无效json,我无法控制它。json是这样的:Java 如何将无效的json转换为有效的json,以便对其进行解析,java,json,regex,Java,Json,Regex,我有一个来自前端的无效json,我无法控制它。json是这样的: { "assetClassDetails":[{}], "assetClassRequired":null, "baseUnitofMeasure":"PMI", "bomParent":"Yes", "commodityCodeTaric":"
{
"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
}
test = test.replaceAll("(,)[\\s]*([^\"])", "_COMMA_ $2");
请看enMaterialLongText和materialLongDescription。我决定用逗号字符分割整个字符串。但这里逗号不仅仅是键值对分隔符,它还存在于某些值中。所以我用了这样的正则表达式:
{
"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
}
test = test.replaceAll("(,)[\\s]*([^\"])", "_COMMA_ $2");
这很有效。现在我需要另一个正则表达式,以便嵌套的引号可以转换为字符串,如“QUOTE”。Gson将json解析为java对象后,我可以将诸如enMaterialLongText和materialLongDescription之类的属性转换为转义引号。如果键和值的格式与问题中的格式不同,那么任意地,您无法在您端修复json,它应该在提供者端修复 假设键值对位于单独的行上,则可以使用
StringBuffer fixedJSON=new StringBuffer();
Matcher m=Pattern.compile(“(?如果无效JSON的格式是这样的,每个键值都在自己的行上,那么可以使用String result=Pattern.compile((?x.group().replace(“\”,”))
@WiktorStribiżew我使用的是java 8,它是Matcher.replaceAll在java 9之前不使用函数接口。您能建议我如何修改java 8的这个接口吗。