我在尝试使用对象映射器解析字符串值时遇到问题。
下面是我的代码,
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Payload {
private String id;
private String message;
}
然后是我的主课
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);
}
}
我的 JSON 字符串包含一个带双引号“”的单词。看起来是因为同样的原因,当我尝试使用 ObjectMapper readValue 方法解析 JSON 时,它给了我以下异常,
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 功能允许反斜杠转义任何字符,但仍然没有运气。
任何人都可以指导如何使对象映射器忽略用于跳过双引号的反斜杠。
任何帮助或指示表示赞赏。
正如您所知,Java 要求字符串常量内的双引号字符用反斜杠转义。
但是,JSON 也 要求字符串值内的双引号字符用反斜杠转义。 你没有那样做。 事实上,您的字符串中没有反斜杠字符。 (序列
\"
是单个双字符;字符串数据中没有实际的反斜杠字符。)
到目前为止,消除这种混乱的最佳方法是使用多行字符串:
String payloadText = """
{"id":"1","message":"Message \\"Yes\\""}
""";
但是如果你真的想在一行中完成所有操作,则需要是这样的:
String payloadText = "{\"id\":\"1\",\"message\":\"Message \\\"Yes\\\"\"}";
注意:我已将右大括号 (
}
) 添加到您的 JSON 内容中。 如果没有它,您仍然会因为不同的原因而得到 JsonParseException。