Как преобразовать объект application / json в строку

#json #jackson #urlconnection

#json #джексон #urlconnection

Вопрос:

Я программно перехожу на сайт, который возвращает формат application / json. Кажется, я не могу прочитать json, возвращенный в HttpURLConnection. Я использую Jackson для преобразования JSON в объект java. Код является:

 InputStreamReader isr = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
    sb.append(line);
    line = br.readLine();
}
geoLocation = (new ObjectMapper()).readValue(sb.toString(), GeoLocation.class);
  

Когда я печатаю sb.toString(), я получаю забавно выглядящие символы и юникоды. Я должен получить правильно сформированную строку. Результирующее исключение является:

 org.codehaus.jackson.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (r, n, t) is allowed between tokens
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@3f6dadf9; line: 1, column: 2]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
  

Например, если мой URL-адрес:

 http://api.ipinfodb.com/v3/ip-city/?key=<mykeyhere>amp;ip=38.111.145.101amp;format=xml
  

Я получаю следующее в окне браузера:

 <?xml version="1.0" encoding="UTF-8"?>
<Response>
    <statusCode>OK</statusCode>
    <statusMessage></statusMessage>
    <ipAddress>38.111.145.101</ipAddress>
    <countryCode>US</countryCode>
    <countryName>UNITED STATES</countryName>
    <regionName>CALIFORNIA</regionName>
    <cityName>OAKLAND</cityName>
    <zipCode>94601</zipCode>
    <latitude>37.7993</latitude>
    <longitude>-122.24</longitude>
    <timeZone>-08:00</timeZone>
</Response>
  

Но когда я делаю

 http://api.ipinfodb.com/v3/ip-city/?key=<mykeyhere>amp;ip=38.111.145.101amp;format=json
  

Он предлагает мне загрузить файл. Как только вы открываете файл после его загрузки, он содержит:

 {
    "statusCode" : "OK",
    "statusMessage" : "",
    "ipAddress" : "38.111.145.101",
    "countryCode" : "US",
    "countryName" : "UNITED STATES",
    "regionName" : "CALIFORNIA",
    "cityName" : "OAKLAND",
    "zipCode" : "94601",
    "latitude" : "37.7993",
    "longitude" : "-122.24",
    "timeZone" : "-08:00"
}
  

Я также попытался передать входной поток непосредственно Джексону, но это не удалось с тем же результатом.

 geoLocation = (new ObjectMapper()).readValue(urlConn.getInputStream(), GeoLocation.class);
  

Есть идеи, как я могу извлечь JSON из URLConn в видимом строковом формате, чтобы я мог передать его Jacson?

Спасибо

Ответ №1:

По умолчанию HttpURLConnection устанавливается кодировка в gzip . Как только я отключил его, я смог прочитать строку из потока:

 urlConn.setRequestProperty("Accept-Encoding", "identity");
  

Комментарии:

1. Если бы это было проблемой, вы могли бы также обернуть входной поток соединения в GZIPInputStream для его декодирования.