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

使用ObjectMapper解析含双引号的Java字符串时遇JsonParseException

问题:ObjectMapper解析含双引号的JSON字符串时抛出JsonParseException

问题代码与异常

实体类Payload

@Data
@NoArgsConstructor
@AllArgsConstructor    
public class Payload {
    private String id;
    private String message;
}

主类MyClass

import com.fasterxml.jackson.databind.ObjectMapper;

public class MyClass {
  public static void main(String args[]) throws Exception {
    
    String payloadText = "{\"id\":\"1\",\"message\":\"Message \"Yes\"\"}";
    ObjectMapper mapper = new ObjectMapper();
    
    Payload p = mapper.readValue(payloadText, Payload.class);
    System.out.println(p);
  }
}

抛出的异常

Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Unexpected character ('Y' (code 89)): was expecting comma to separate Object entries
 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 31]
    at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2660)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:741)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipComma(ReaderBasedJsonParser.java:2429)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextFieldName(ReaderBasedJsonParser.java:924)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:317)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
    at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4917)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3828)
    at MyClass.main(MyClass.java:9)

已尝试使用StringEscapeUtils转义、开启JsonParser.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER特性,均无法解决问题,询问如何让ObjectMapper正确处理含转义双引号的JSON字符串。

解决方案

核心问题是Java字符串中的反斜杠需要二次转义,原代码里的JSON字符串在Java编译后已经变成了非法格式:原代码中的"Message \"Yes\""会被Java解析为"Message "Yes"",直接破坏了JSON的结构,这才是解析失败的根本原因。

方法一:使用双反斜杠转义

在Java字符串中,要表示JSON里的\",需要写成\\"(Java会把\\解析为单个\),修改后的代码如下:

String payloadText = "{\"id\":\"1\",\"message\":\"Message \\\"Yes\\\"\"}";

方法二:使用Java文本块(Java 15+)

如果使用Java 15及以上版本,可以用文本块简化写法,文本块内的双引号和反斜杠不需要额外转义:

String payloadText = """
    {"id":"1","message":"Message \"Yes\""}
    """;

修改后,ObjectMapper就能正常解析该JSON字符串,不会抛出解析异常。之前尝试的工具类和配置无效,是因为原始字符串本身就不是合法的JSON,先确保字符串格式正确才是关键。

内容的提问来源于stack exchange,提问作者WebNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:46:11