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)
自版本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 问题可以在这里找到,这个问题提出了一些关于如何实现配置的替代方案。
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)