使用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
相关产品推荐
相关产品推荐

