uniappp wxmp-rsa 非对称解密时,发现图文格式的内容解密失败还会导致json字符串不完整,导致拿不到数据,属实无法了,找了很多很多办法都不行,突然想着要不把错误的json字符串补齐吧,于是找到这个文章-博主是真的厉害啊,我这里只是记录一下,以免下回忘记
如果 JSON 字符串格式不正确,解析它时会抛出异常,但我们可以尝试尽可能提取有效的信息。以下是一个方法,可以使用正则表达式和字符串操作来提取部分有效的 JSON 内容,即使整个字符串无法被 JSON.parse 完全解析。
代码如下:
function safeJSONParse(jsonString) {
try {
return JSON.parse(jsonString);
} catch (error) {
console.error("Invalid JSON format:", error);
// 尝试手动提取有效的 JSON 键值对
const extractedData = {};
const keyValuePattern = /"(\w+)":\s*("[^"]*"|\d+|true|false|null)/g;
let match;
while ((match = keyValuePattern.exec(jsonString)) !== null) {
const key = match[1];
let value = match[2];
// 如果 value 是字符串,去掉引号
if (value.startsWith('"') && value.endsWith('"')) {
value = value.slice(1, -1);
} else if (value === 'true') {
value = true;
} else if (value === 'false') {
value = false;
} else if (value === 'null') {
value = null;
} else if (!isNaN(value)) {
value = Number(value);
}
extractedData[key] = value;
}
return extractedData;
}
}
// 使用示例
const invalidJsonString = '{name: "John", "age": 30, "valid": true, "missing_quote: "error"}';
const parsedData = safeJSONParse(invalidJsonString);
console.log("Extracted data:", parsedData);
在这个示例中,safeJSONParse 函数首先尝试使用 JSON.parse 解析字符串。如果解析失败,则使用正则表达式从字符串中提取有效的键值对。正则表达式 /“(\w+)”:\s*(“[^”]*"|\d+|true|false|null)/g 匹配键值对的常见模式,包括字符串、数字、布尔值和 null。提取到的值根据类型进行转换,然后存储在 extractedData 对象中,最后返回这个对象。
这种方法虽然不能保证提取到所有正确的数据,但在 JSON 格式不正确时,尽可能提取有用的信息。
原文链接:https://blog.csdn.net/u012953777/article/details/140137176