能否无需转换为字符串,直接将二进制数据以字符串形式写入JSON?
直接将二进制数据作为字符串写入JSON不可行
别尝试直接把二进制数据当字符串塞进JSON里,大概率会踩坑:
- 二进制数据里通常包含大量非UTF-8兼容的字节(比如ASCII控制字符、0x00空字节、超出ASCII范围的无效编码字节),而JSON规范要求字符串必须是有效的UTF-8编码。强行写入的话,要么序列化时直接报错,要么存储后出现乱码,读取时解析器无法正确还原数据,甚至直接崩溃。
- 你提到的“只读写双引号间内容”完全不现实,JSON解析器会严格校验字符串内容的合法性,不是单纯把双引号里的内容原封不动读出来就算完。一旦遇到非法字符,解析器会直接抛出错误,根本不会返回你期望的二进制数据。
正确的做法还是用你已经了解的Base64编码:把二进制数据转成由ASCII可打印字符组成的字符串,这样完全符合JSON字符串的要求,序列化和反序列化过程都不会有问题,还能保证数据完整无损。
举个简单的Python例子对比:
import json import base64 # 二进制数据 binary_data = b'\x00\xFF\x7F\x80' # 错误做法:直接转字符串存JSON try: json_str = json.dumps({"data": str(binary_data, 'latin-1')}) loaded = json.loads(json_str) # 读取时用utf-8解码会报错 restored = loaded["data"].encode('utf-8') except UnicodeDecodeError as e: print(f"错误:{e}") # 正确做法:用Base64 base64_str = base64.b64encode(binary_data).decode('utf-8') json_str = json.dumps({"data": base64_str}) loaded = json.loads(json_str) restored = base64.b64decode(loaded["data"]) print(f"还原后的数据:{restored}") # 输出 b'\x00\xff\x7f\x80',和原数据一致
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

