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

如何让Jackson ObjectMapper将非严格JSON原样返回为字符串?

解决方案

核心思路

要搞定这个问题,得先确认输入能不能完整解析成单个Map对象,而不是只解析开头部分。具体分两步:

  1. 先尝试解析输入为Map,之后检查有没有没处理完的剩余令牌;
  2. 如果有剩余令牌,或者解析时出错,就返回原字符串;没问题的话返回解析后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:01:04