You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:42:31