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
我需要做一个 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