我需要使用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)
答案 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