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

Ami*_*oda 3 java json http-post parse-error jackson

我需要使用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);
Run Code Online (Sandbox Code Playgroud)

这里所有其他人都正确映射期望userId.这里的问题是反斜杠(mlpdemo\mlpdemins).我猜.如果我发送一个字符串作为用户ID,它将被映射而没有任何问题.例如:-

String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemoins\" }";
Run Code Online (Sandbox Code Playgroud)

这有效.

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

String jsonData = "{ \"provider\" : null , \"password\" : \"a\", \"userid\" : \"mlpdemo\\mlpdemoins\" }";
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外.

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)
Run Code Online (Sandbox Code Playgroud)

oga*_*onm 20

设置您的映射器

mapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true); 
Run Code Online (Sandbox Code Playgroud)

  • 这实际上应该是公认的答案。 (3认同)

Mag*_*lex 6

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

@deprecated 自 2.10 起使用 {@link com.fasterxml.jackson.core.json.JsonReadFeature#ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER} 代替

虽然当时的属性仍然存在于当前版本(2.11.3)中,但它实际上已从 GIT master 分支中删除,这表明它可能会在版本3.0.0发布时删除。

配置此属性的正确方法是使用JsonReadFeature代替。不要创建ObjectMapper并调用configure()它,而是使用JsonMapper它的builder()方法:

ObjectMapper mapper = JsonMapper.builder()
    .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)
    .build();
Run Code Online (Sandbox Code Playgroud)

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


相关的 GitHub 问题可以在这里找到,这个问题提出了一些关于如何实现配置的替代方案。


Sac*_*141 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));
Run Code Online (Sandbox Code Playgroud)

它会产生这个输出JSON:

{"provider":null,"password":"a","userid":"mlpdemo\\mlpdemoins"}
Run Code Online (Sandbox Code Playgroud)