如何让Jackson ObjectMapper将非严格JSON原样返回为字符串?
解决方案
核心思路
要搞定这个问题,得先确认输入能不能完整解析成单个Map对象,而不是只解析开头部分。具体分两步:
- 先尝试解析输入为
Map,之后检查有没有没处理完的剩余令牌; - 如果有剩余令牌,或者解析时出错,就返回原字符串;没问题的话返回解析后的
Map。
代码修改示例
直接用JsonParser手动控制解析流程就行,代码如下:
ObjectMapper mapper = new ObjectMapper(); String input = "{\"StrKey1\":\"StrValue1\"},{\"StrKey2\":\"StrValue2\"}"; Object result; try (JsonParser parser = mapper.getFactory().createParser(input)) { // 解析第一个Map对象 Map<?, ?> parsedMap = mapper.readValue(parser, Map.class); // 检查是否还有未处理的令牌 parser.nextToken(); if (parser.getCurrentToken() == null) { // 没有剩余令牌,说明是合法的单个Map JSON result = parsedMap; } else { // 存在剩余令牌,返回原字符串 result = input; } } catch (JsonProcessingException e) { // 解析失败(比如格式错误),返回原字符串 result = input; } // 后续逻辑照常判断类型 if (result instanceof Map) { System.out.println("解析后的Map: " + result); } else { System.out.println("原输入字符串: " + result); }
关键细节
- 不用全局开启
FAIL_ON_TRAILING_TOKENS,而是手动检查剩余令牌,不会影响其他地方的解析逻辑; - 依然保留
Map.class作为解析目标,后续逻辑还是能通过instanceof Map判断结果类型; - 不管是多个JSON对象并列(有剩余令牌),还是JSON格式本身出错(抛异常),都会返回原输入字符串,覆盖了要求的无效场景。
内容的提问来源于stack exchange,提问作者user5801655
相关产品推荐
相关产品推荐

