Flutter中加密解密JSON文件后无法读取JSON键值对问题咨询
Flutter JSON加解密后无法读取键值对问题排查与解决
排查步骤
- 校验解密后原始字符串:将解密得到的结果直接通过
print()输出,和加密前的原始JSON字符串逐位对比,确认是否存在多余空白字符、乱码、首尾空字符/不可见特殊符号、BOM头等无效内容,大部分解析失败都是因为解密后的字符串掺杂了非JSON内容。 - 校验编码一致性:确认加密前字符串转字节、解密后字节转字符串的编码规则完全统一,必须显式指定
utf8编码,禁止使用系统默认编码。比如加密时用utf8.encode(originalJsonStr),解密后必须对应使用utf8.decode(decryptedBytes)。 - 校验JSON格式合法性:将解密得到的字符串直接传入
jsonDecode()方法,查看是否抛出FormatException异常,确认格式本身没有被加解密逻辑损坏。 - 校验字节处理逻辑:确认加密前的字节数组长度、解密后的字节数组长度是否匹配,排查是否存在字节截断、加密补位未正常移除的问题,比如AES的PKCS7补位在解密后必须清除,否则会在字符串末尾残留无效字符。
解决方案
- 清除加密补位残留:如果使用分组加密算法,解密后先移除补位字符再转字符串,示例代码:
// PKCS7补位移除示例 Uint8List removePkcs7Padding(Uint8List bytes) { int padLength = bytes.last; return bytes.sublist(0, bytes.length - padLength); }
- 清理无效字符:解密得到字符串后先清理不可见控制字符再做解析,示例代码:
String cleanedStr = decryptedStr.replaceAll(RegExp(r'[\x00-\x1F\x7F]'), '').trim(); Map<String, dynamic> jsonData = jsonDecode(cleanedStr);
- 标准化序列化流程:加密前必须先将JSON对象通过
jsonEncode()序列化为标准字符串再转字节,禁止直接序列化对象的二进制流,避免不同环境下序列化规则不一致。
内容的提问来源于stack exchange,提问作者arjun rathod
相关产品推荐
相关产品推荐

