Python端Base64编码JSON含None,Java端解码报错如何解决?
可行解决方案
问题本质是Python侧输出的字符串不符合标准JSON规范:标准JSON要求空值标识为null,但直接对Python字典执行字符串转换会输出Python独有的空值标识None,导致Java侧JSON解析失败。
方案1:Python侧修改序列化逻辑(优先推荐)
该方案从根源生成符合标准的JSON,无后续兼容风险,成本最低
- 使用Python标准
json库做序列化,不要直接对字典执行str()转换。json.dumps()方法会自动将Python的None转换为JSON规范的null,空字段也会完整保留:import json data = { "name": "John", "Age": 24, "Income": None } # 序列化后输出符合JSON规范的字符串:{"name": "John", "Age": 24, "Income": null} json_str = json.dumps(data) # 再对json_str做Base64编码即可输出和Java侧一致的结果:eyAibmFtZSI6ICJKb2huIiwgIkFnZSI6IDI0LCAiSW5jb21lIjogbnVsbH0= - 兜底兼容:如果已有逻辑生成了带
None的JSON字符串,可通过正则精准替换独立的None关键字为null,避免误替换字段值中包含的None字符:import re raw_str = "{ 'name': 'John', 'Age': 24, 'Income': None }" standard_json = re.sub(r'(?<=[\s:,{\[])None(?=[\s,}\]])', 'null', raw_str)
方案2:Java侧做兼容处理(适用于无法修改Python侧代码的场景)
- 预处理JSON字符串:Base64解码得到原始字符串后,先执行和上述逻辑一致的正则替换,将
None替换为null后再交给JSON解析器解析。 - 自定义JSON反序列化规则:以常用的Jackson解析库为例,配置自定义反序列化器识别
None为null:import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import java.io.IOException; // 初始化ObjectMapper时添加自定义规则 ObjectMapper objectMapper = new ObjectMapper(); SimpleModule nullParseModule = new SimpleModule(); nullParseModule.addDeserializer(Object.class, new StdDeserializer<Object>(Object.class) { @Override public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { if ("None".equals(jsonParser.getText())) { return null; } return jsonParser.readValueAs(Object.class); } }); objectMapper.registerModule(nullParseModule);
内容的提问来源于stack exchange,提问作者mightyMouse
相关产品推荐
相关产品推荐

