2 回答

TA贡献1854条经验 获得超8个赞
String incorrectJson = "{id: 267107086801, productCode: 02-671070868,"
+ " lastUpdate: 2018-07-15, lastUpdateTimestamp: 2018-07-15 01:49:58,"
+ " user: {pf: {document: 123456789, name: Luis Fernando},"
+ " address: {street: Rua Pref. Josu00e9 Alves Lima,number:37},"
+ " payment: [{sequential: 1, id: CREDIT_CARD, value: 188, installments: 9}]}";
String correctJson = incorrectJson.replaceAll("(?<=: ?)(?![ \\{\\[])(.+?)(?=,|})", "\"$1\"");
System.out.println(correctJson);
输出:
{id:“267107086801”,productCode:“02-671070868”,lastUpdate:“2018-07-15”,lastUpdateTimestamp:“2018-07-15 01:49:58”,用户:{pf:{document:“123456789 ",姓名:"Luis Fernando"},地址:{街道:"Rua Pref. Josu00e9 Alves Lima",编号:"37"},付款:[{sequential:"1",id:"CREDIT_CARD",值:" 188”,分期付款:“9”}]}
非平凡的正则表达式的一个缺点是它们很难阅读。我在这里使用的匹配每个文字值(但不匹配对象或数组的值)。我使用冒号、逗号和大括号来指导匹配,所以我不需要关心每个字符串值内部的内容,它可以是任何字符(逗号或右大括号除外)。零件的意思是:
(?<=: ?):在值之前有一个冒号和一个可选的空格(后视)
(?![ \\{\\[])该值不以空白、花括号或方括号开头(负前瞻;空白,因为我们不希望冒号和值之间有空白作为值的一部分)
(.+?):该值由至少一个字符组成,尽可能少(不情愿的量词;或者正则表达式会尝试获取字符串的其余部分)
(?=,|}): 值后是逗号或右花括号(正向前瞻)。
如果不精通 JSON,我认为您不需要引用名称。不过,您可以:
String correctJson = incorrectJson.replaceAll(
"(?<=\\{|, ?)([a-zA-Z]+?): ?(?![ \\{\\[])(.+?)(?=,|})", "\"$1\": \"$2\"");
{“id”:“267107086801”,“productCode”:“02-671070868”,“lastUpdate”:“2018-07-15”,“lastUpdateTimestamp”:“2018-07-15 01:49:58”,用户: {pf:{“document”:“123456789”,“name”:“Luis Fernando”},地址:{“street”:“Rua Pref. Josu00e9 Alves Lima”,“number”:“37”},付款:[ {“顺序”:“1”,“id”:“CREDIT_CARD”,“价值”:“188”,“分期付款”:“9”}]}

TA贡献1712条经验 获得超3个赞
以下代码注意 JSON 字符串中存在的单引号以及包含数字的键
jsonString = jsonString.replaceAll(":",":"); // 键后跳空格 jsonString = jsonString.replaceAll(": ,",":,"); jsonString = jsonString.replaceAll("(?<=: ?)(?![ \{\[])(.+?)(?=,|})", ""$1""); jsonString = jsonString.replaceAll("(?<=\{|, ?)([a-zA-Z0-9]+?)(?=:)",""$1""); jsonString = jsonString.replaceAll(""true"", "true"); // 取消引用 boolean jsonString = jsonString.replaceAll(""false"", "false"); // 取消引用 boolean jsonString = jsonString.replaceAll(""null"", "null");// 取消引用 null jsonString = jsonString.replaceAll(":",", ":"" ,) ; // 删除不必要的双引号 jsonString = jsonString. replaceAll("true"", "true"); // 取消引用 boolean jsonString = jsonString.replaceAll("'",", "',"); // 处理 json 字符串中的单引号 jsonString = jsonString.replaceAll("'},", "'}","); // 将双引号放在以单引号结尾的字符串之后
添加回答
举报