Base64编码的JSON payload存入ByteBuffer后解码丢失符号如何解决
问题核心原因
DatatypeConverter.parseBase64Binary是JAXB提供的Base64解码工具,本身不会主动过滤JSON结构符号,出现内容缺失通常是三类问题导致:
- 该工具对URL安全格式的Base64兼容能力差,而在线解码平台通常会自动兼容标准Base64、URL安全Base64两种格式,所以会出现在线解码正常、代码解码异常的情况
- 解码后的字节数组转字符串时未明确指定字符集,或写入ByteBuffer后未复位指针导致读取不完整
- 高版本JDK(9+)已移除JAXB相关模块,
DatatypeConverter的第三方兼容实现可能存在解码异常
解决方案
- 优先替换为JDK 8及以上内置的
java.util.Base64工具类,兼容两种Base64格式,稳定性更高:- 解码标准Base64使用
Base64.getDecoder() - 解码URL安全Base64(
+替换为-、/替换为_、尾部填充=被去除)使用Base64.getUrlDecoder()
- 解码标准Base64使用
- 解码后先验证字节数组转字符串的完整性,必须明确指定UTF-8字符集:
byte[] decodedJsonBytes = Base64.getDecoder().decode(yourBase64Str); // 可直接打印验证JSON结构是否完整 String jsonContent = new String(decodedJsonBytes, StandardCharsets.UTF_8); - 正确操作ByteBuffer避免内容截断:
ByteBuffer buffer = ByteBuffer.allocate(decodedJsonBytes.length); buffer.put(decodedJsonBytes); // 写入完成后必须调用flip复位指针位置,否则后续读取会从字节末尾开始,得到空内容或截断内容 buffer.flip();
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

