如何在 Java 中使用正则表达式将引号不一致的无效 JSON 之类的字符串转换为有效的 JSON?
How to convert invalid JSON like string with inconsistent quotes into a valid JSON using regex in Java?
这是一个示例字符串。由于存在逗号,我在 'rgba(71,13,226,0.47)'
部分尤其遇到麻烦。同样的正则表达式也应该解析一个 JSON 数组,比如 string.
varStr ="{
red : {
orange: 100,
dates: {
later: "4_WEEK",
now: "1_WEEK"
},
pink: {
crimson : '#16gcvcn',
lavender : '#47vdsaj',
purple : '#h7465',
baby pink : '#hd576',
yellow : 'rgba(71,13,226,0.47)',
magenta : 'rgba(211,25,25,0.01)'
}
}
}";
到目前为止,我有一系列的正则表达式替换,但我的正则表达式存在问题,它不能处理所有情况。
varStr = varStr.replaceAll("([^:{,\"\n =\[}\]][\w &|\/'.\-)#]+)", "\"\"");
varStr = varStr.replace("\"[", "[");
varStr = varStr.replace("]\"", "]");
varStr = varStr.replaceAll("'", "\"");
我想首先向您指出,以这种方式将字符串转换为 JSON 会将每个值视为 String
。 Number
或 Boolean
等一些数据类型在反序列化时将被忽略并失去其便利性。
您可以按如下方式实现您想要的,如果我能找到更优雅的解决方案,我将更新我的解决方案!
代码片段
String regex = "(?:[{ ])(\w+)(?!\")";
varStr = varStr.replaceAll(regex, "\\"\\"");
varStr = varStr.replace("\"\"", " ").replace("'", "\"");
顺便说一句,尽管 JSON 没有标准的命名约定,但我从未见过用空 space(s) 分隔的字段名称。因此,最好使用babyPink
、baby_pink
和baby-pink
中的一种。
这是一个示例字符串。由于存在逗号,我在 'rgba(71,13,226,0.47)'
部分尤其遇到麻烦。同样的正则表达式也应该解析一个 JSON 数组,比如 string.
varStr ="{
red : {
orange: 100,
dates: {
later: "4_WEEK",
now: "1_WEEK"
},
pink: {
crimson : '#16gcvcn',
lavender : '#47vdsaj',
purple : '#h7465',
baby pink : '#hd576',
yellow : 'rgba(71,13,226,0.47)',
magenta : 'rgba(211,25,25,0.01)'
}
}
}";
到目前为止,我有一系列的正则表达式替换,但我的正则表达式存在问题,它不能处理所有情况。
varStr = varStr.replaceAll("([^:{,\"\n =\[}\]][\w &|\/'.\-)#]+)", "\"\"");
varStr = varStr.replace("\"[", "[");
varStr = varStr.replace("]\"", "]");
varStr = varStr.replaceAll("'", "\"");
我想首先向您指出,以这种方式将字符串转换为 JSON 会将每个值视为 String
。 Number
或 Boolean
等一些数据类型在反序列化时将被忽略并失去其便利性。
您可以按如下方式实现您想要的,如果我能找到更优雅的解决方案,我将更新我的解决方案!
代码片段
String regex = "(?:[{ ])(\w+)(?!\")";
varStr = varStr.replaceAll(regex, "\\"\\"");
varStr = varStr.replace("\"\"", " ").replace("'", "\"");
顺便说一句,尽管 JSON 没有标准的命名约定,但我从未见过用空 space(s) 分隔的字段名称。因此,最好使用babyPink
、baby_pink
和baby-pink
中的一种。