Java解析OpenSearch响应报错:JSONObject需以'{'开头的问题排查
问题原因解析
核心原因是HttpClient的HttpEntity是一次性消费的流结构:
- 当你第一次调用
EntityUtils.toString(response.getEntity())时,这个方法会把响应流里的所有数据全部读取出来,同时会把流的指针移到末尾(甚至直接关闭流)。 - 第二次调用同一个方法时,流已经没有可读取的内容了,返回的其实是空字符串(或者无意义的空白内容),这时候拿这个空内容去解析JSON,必然会抛出"A JSONObject text must begin with '{' at 0 [character 1 line 1]"的异常——因为解析的根本不是有效JSON。
你之前看到的“合法JSON”应该是第一次调用方法时打印的结果,第二次调用拿到的内容已经是空的了,trim自然也解决不了问题。而改成先把响应内容存入字符串再复用,就避免了重复读取流的问题,自然就能正常解析了。
如果确实需要多次使用响应内容,除了提前存字符串,也可以把HttpEntity包装成BufferedHttpEntity来实现重复读取,但最直接省事的还是提前把内容读取到字符串中复用。
内容的提问来源于stack exchange,提问作者Gengis Khan
相关产品推荐
相关产品推荐

