当前位置: 首页 > 知识库问答 >
问题:

HttpMessageNotReadableException:JSON分析错误:无法识别的令牌''

印嘉泽
2023-03-14

我通过RestTemplate调用一个endpoint,如下所示:

   SSLContext sslContext = SSLContexts.createSystemDefault();
   SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
   HttpClient client = HttpClientBuilder.create().setSSLSocketFactory(socketFactory).build();
   ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client);

   HttpEntity<String> entity = new HttpEntity<>(requestJson, headers());
   Object[] response = restTemplate.postForObject(uri, entity, Object[].class);

我已经验证了entity对象中的JSON字符串是有效的,方法是将其复制并在对同一endpoint的cURL请求中使用,没有任何错误。在此请求中也使用了相同的头和授权令牌。

当我执行POST时,返回以下错误:

Error while extracting response for type [class [Ljava.lang.Object;] and content type [application/json;charset=utf-16]
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token '嬀崀': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token '嬀崀': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
     at [Source: (InputStreamReader); line: 1, column: 3]

我的acceptcontent-type头都设置为application/json。通过检查来自cURL的输出,我看到响应体中没有汉字。

响应标头如下:

Connection →keep-alive
Content-Encoding →gzip
Content-Type →application/json; charset=utf-8
Date → xxx
Transfer-Encoding →chunked
Vary →Accept-Encoding

当我将responseType设置为string.classobject.class时发出请求,响应是中文字符:

restTemplate.postForObject(uri, entity, String.class);
嬀崀

我希望此调用返回一个空数组[]

当我将requestJSON字符串更改为一个可以返回非空数组的字符串时,我将返回数百个汉字,而不是两个。

我如何像使用curl时一样解码响应以获得有效数据?

编辑:

我不确定这是如何联系的,但空数组[]中字符的字节码是91和93,两个汉字的字节码是0、91、0、93。

共有1个答案

施飞鸿
2023-03-14

不要使用UTF16。HTTP规范说ASCII,许多使用UTF8。错误通过charset=utf-16指出了这一点。尝试设置请求的编码标头。

正如您在char代码中注意到的,您看到的正是使用UTF16时预期的结果,因为每个char是2个字节

 类似资料:
  • 我向web服务添加了以下依赖项 现在我的代码中出现了以下问题,不知道哪里出了问题。在添加这个依赖项之前,它工作得很好。 下面是完整的pom 我不明白哪里出了问题

  • 我正在将下面的sql查询转换为Snowflake,并得到错误“numeric Value”-“未识别”,但它没有行号。我假设它在整个查询中引用了各种“-1”实例,但没有引用任何行,所以不清楚是什么导致了这个问题。如果是对“-1”的各种引用--雪花中的替代方案是什么?Try_To_Number在这种情况下不起作用,所以希望社区有建议

  • 我正在编写一个ANTLR Lexer和解析器语法,它将解析与Java类非常相似的文本。最终,它将解析如下所示的文本: 我正在慢慢地构建Lexer和Parser。我已经成功地解析了,但是在解析时遇到了困难。 在添加对的支持之前,我能够在解析器中为空格、冒号和分号使用字符串文字,但在我遇到错误创建隐式标记。我为这些字符中的每一个定义了一个词法分析器规则,并用该规则替换了所有出现的文字。但是,这破坏了s

  • 我使用一个Spring Boot项目,我希望在程序启动后执行多个请求,而不是在程序启动后手动使用cURL。其目的是在存储器中存储一些数据,并使平台为进一步的操作做好准备。我使用的原始命令(运行良好), 如何在此方案中为POST调用正确设置媒体数据?