Java + jackson 解析错误 Unrecognized character escape

Java + jackson parsing error Unrecognized character escape

我需要做一个 POST json 字符串,使用 HttpClient。以下将是我的代码。从另一端 Json 映射到一个对象。

HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemo\mlpdemoins\" }";
post.setEntity(new ByteArrayEntity(         jsonData.toString().getBytes("UTF8")));
HttpResponse response = client.execute(post);

这里除了 userId 之外,所有其他人都正确映射。这里的问题是反斜杠(mlpdemo\mlpdemins)。我猜。如果我发送一个字符串作为用户 ID,它将被毫无问题地映射。 例如:-

String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemoins\" }";

这有效。

但我需要通过 POSt 发送这个 (mlpdemo\mlpdemins)。请帮帮我。

String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemo\mlpdemoins\" }";

这是我遇到的异常。

com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape 'm' (code 109)
 at [Source: java.io.InputStreamReader@29f0a0a2; line: 1, column: 62]
BadRequestException (0ea35150-f33a-4932-a31e-8a1048af53ad): 400 Bad Request, com.strategicgains.restexpress.serialization.DeserializationException: com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape 'm' (code 109)
 at [Source: java.io.InputStreamReader@29f0a0a2; line: 1, column: 62]
    at com.strategicgains.restexpress.Request.getBodyAs(Request.java:165)
    at com.strategicgains.restexpress.Request.getBodyAs(Request.java:181)

mlpdemo\mlpdemoins 是无效字符串,您不能在 JSON 中使用它。但是你可以轻松使用mlpdemo\mlpdemoins

下面的代码对我来说很好用:

String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemo\\mlpdemoins\" }";

ObjectMapper mapper=new ObjectMapper();

System.out.println(mapper.readTree(jsonData));

它将产生这个输出 JSON :

{"provider":null,"password":"a","userid":"mlpdemo\mlpdemoins"}

设置映射器

mapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true); 

自版本 2.10(2019 年 9 月发布)以来,JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER 已被弃用,连同其他一些属性:

@deprecated Since 2.10 use {@link com.fasterxml.jackson.core.json.JsonReadFeature#ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER} instead

虽然当时的属性在现在的版本(2.11.3)中还存在,但是有actually been removed from the GIT master branch,暗示可能会在版本更新的时候去掉3.0.0 已发布。

配置此 属性 的正确方法是使用 JsonReadFeature instead. Instead of creating an ObjectMapper and call configure() on it, use JsonMapper 及其 builder() 方法:

ObjectMapper mapper = JsonMapper.builder()
    .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)
    .build();

此 returns 一个 JsonMapper,它是 ObjectMapper 的子 class,启用了 属性。


可以找到相关的 GitHub 问题 here, and this issue 提出了一些关于如何实现配置的替代方案。

在我的例子中,我使用的是 Spring,所以在 application.yml 中设置这个 属性 完成了工作:

spring:
  jackson:
    parser:
      allow-backslash-escaping-any-character: true

这条 GitHub 评论很有帮助:https://github.com/FasterXML/jackson-core/issues/586#issuecomment-672199588