使用对象映射器解析 Java 字符串中的双引号时出现 JsonParseException

问题描述 投票:0回答:1

我在尝试使用对象映射器解析字符串值时遇到问题。

下面是我的代码,

@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 jackson-databind objectmapper
1个回答
0
投票

正如您所知,Java 要求字符串常量内的双引号字符用反斜杠转义。

但是,JSON 要求字符串值内的双引号字符用反斜杠转义。 你没有那样做。 事实上,您的字符串中没有反斜杠字符。 (序列

\"
是单个双字符;字符串数据中没有实际的反斜杠字符。)

到目前为止,消除这种混乱的最佳方法是使用多行字符串:

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

但是如果你真的想在一行中完成所有操作,则需要是这样的:

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

注意:我已将右大括号 (

}
) 添加到您的 JSON 内容中。 如果没有它,您仍然会因为不同的原因而得到 JsonParseException。

© www.soinside.com 2019 - 2024. All rights reserved.