Java中如何转义JSON字符串中的十六进制及UnicodeBlock字段?
JSON解析异常问题及解决思路
问题背景
我在项目中通过API接收结构不一致的JSON消息,使用BasicJsonParser将其解析为Map<String, Object>,再通过map.get("fieldName")获取字段。但近期某个字段导致解析异常,无法正确映射TIMESTAMP字段,返回null。
异常JSON示例
{ "name" : "Charlie", "school" : "public elementary school", "city": "New York,NY", "problematicField" : "\u000l\u00033\u00007█\u00007[\u003d\" .... 该字段内容较长, "TIMESTAMP":{"timestamp": "2022-09-01 10:00:00.00000000000"} }
需求与现状
我仅需要name、school和TIMESTAMP字段,但由于problematicField中包含特殊控制字符,导致解析器处理到该字段时出现异常,后续的TIMESTAMP无法被正确映射,返回null。且无法要求API提供方移除该字段。
当前解析代码
BasicJsonParser parser = new BasicJsonParser(); final Map<String,Object> map; map = parser.parseMap(message); String name = String.valueOf(map.get("name")); String school = String.valueOf(map.get("school")); String timeStamp = String.valueOf(map.get("TIMESTAMP"));
目前能正常获取name和school的值,但TIMESTAMP始终返回null。
解决情况
三天后,通过参考相关问题《How to parse JSON in Java》找到了解决方案。
通用可行解决思路
- 更换更健壮的JSON解析库:比如Jackson或Gson,它们对特殊字符、格式瑕疵的容忍度更高,且支持灵活配置。以Jackson为例,可开启允许未转义控制字符的配置:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); Map<String, Object> map = mapper.readValue(message, new TypeReference<Map<String, Object>>() {}); - 预处理JSON字符串:解析前手动移除
problematicField字段,避免其干扰。可通过正则表达式匹配并删除该字段的键值对:// 匹配并移除problematicField字段(注意根据实际JSON格式调整正则) String cleanedMessage = message.replaceAll("\"problematicField\"\\s*:\\s*\"[^\"]*\"\\s*,?", ""); map = parser.parseMap(cleanedMessage); - 调整BasicJsonParser配置:若
BasicJsonParser支持相关配置,尝试开启对控制字符、特殊字符的解析支持,允许包含此类字符的字段通过解析。
内容的提问来源于stack exchange,提问作者Thedros11
相关产品推荐
相关产品推荐

