Java + jackson解析错误无法识别的字符转义

时间:2015-05-12 10:00:20

标签: java json jackson http-post parse-error

我需要使用HttpClient来做一个POST json字符串。以下将是我的代码。从另一端,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)

4 个答案:

答案 0 :(得分:11)

设置您的映射器

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

答案 1 :(得分:5)

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"}

答案 2 :(得分:0)

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

@不建议使用,从2.10开始,请改用{@link com.fasterxml.jackson.core.json.JsonReadFeature#ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER}

当前版本( 2.11.3 )中当时的属性仍然存在,但它具有actually been removed from the GIT master branch,表明在版本 3.0时可能会删除它。 0 被释放。

配置此属性的正确方法是改为使用JsonReadFeature。与其创建ObjectMapper并在其上调用configure(),不如使用JsonMapper及其builder()方法:

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

这将返回JsonMapper,它是ObjectMapper的子类,并且已启用属性。


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

答案 3 :(得分:0)

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

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

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