Java — StackExchange получить JSON

Вот мой код Java, чтобы получить некоторую информацию от stackexchange.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class StackExchangeConnect {

    private static final String URL = "http://api.stackexchange.com/2.2/answers?key=U4DMV*8nvpm3EOpvf69Rxw((&site=stackoverflow&fromdate=1396310400&todate=1398729600&order=desc&sort=activity&filter=default";

    public static void main(String[] args) throws Exception {

        StackExchangeConnect http = new StackExchangeConnect();

        System.out.println("Testing 1 - Send Http GET request");
        http.sendGet();

    }

    // HTTP GET request
    private void sendGet() throws Exception {

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(URL);

        // add request header
        request.addHeader("Accept", "application/json");

        HttpResponse response = client.execute(request);

        System.out.println("Response Code : "
                + response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

}

Я получаю следующее в моей консоли.

Testing 1 - Send Http GET request
Response Code : 200
�

Я попытался записать содержимое в файл, и это похоже на

�\00\00\00\00\00\00�Z�n�H�Cy�;_�`df1��&���.F�ٔK���|I���eƒ�M�,GO�Ev��:U�_gE����_g���U����ʭ7�i�r5���t��]uUd�ʤZW����]���n\���l]�y�pW���[�uӬ�$���;�W��4�:��2��&��:�6�L�N8�2���)�,18?ԯ1Q���E�VMa�ի����_�1�-+���<\�̲}��sS��E��^�co�[W��{y;�:f�n�NgE}e�u��r��E�Ng�-+x8����{S���Uf���V�c!�`wY�xl�r݂n�����әY�w��J�.��quw�h��v\00�0!�`"�k????��U����q�i�:��L�$C4�y���Se�6��Y�hȆ�%u�5��F�0b�̓�P�0��՘�b�*�x������b�����+λ�;/��M���?�����z>@2�1g^���S���ӏ9y��.�ͪ]�v!��F��h/��&�/�I^D3ċ!��6dI�0\00l�a� �S���B��8�q�P���h�   �H<�ݼ��g�^|.����y���G/���c�\00u2a���LQ�����_ņ=ů7w�A?�Ĵ>�$%X� �͇f��Ib�%AA�_8���T����(C�����S�,�Y��A�nYu<K��$��1y��(\00Rg�E�6��Lx�B@���d&x#�->����(?^�pu�^M�粹6����-0�X@�q'���l9���'��~`�&J�}`\'"E,�ڦFJJ�^�>�H*r�q��ܦVZ�X�[ vtzKAn��g�nG ���!�z��:HJ:�oPH�oiFH�m11rt���L@i\00$όu�  'J��+�,KU4fs[5e������vh�� h��K+��4�T>�!*,���JH2.��>$�rC�)�9�!�3k��eee�O��2�`�N�ݯ]���~^ɦ}@��g��>rM��LT�Ѡ\00�m�8�Z�&�z����L�]�j.Ք�8Z�g�3(!�U�a��D\�#��Y�G�m�^lV��&�o��G�cGu���e|���8��(:\9��D&,�T������O���8y�����OQ��|�L�{\00PR�l>\000�d�"����!J�Pa%A�vs����!��j�2�p�3ąS�aĴ��M���&�B�A���9,Dx���b�,�)�&��mI�2]��g9M2F K&s�5��+����5���++xc4\�Ԓy��|ĘV�l�2b�3���D%��m!`㇇7�f}}���K��[(�4���d]�fS���^�~��ֿ}����=��ɶ��kY(�"��|]p��m�2�4DA�����3$��tѩ�j*�T�Y���    Џ.齦W�lzٹ%���Y �(d�@���P���m���{�-"���T)�(IS�n��)}��!I����bq@���O��1a*��0ؼ�("��C}9�<LNۖ�B0�ڮС�qŹ�0�e�N%#.�X  ���F�+�kS�h�3K�i��$bd"��@H�H5�)F=�DL�r�r���E�������<ٶ^e�{8�x���(oب�F��� g���]�B�l�6/��Q�gR`O�g��p%1s�I[�G���Ooq�J8�*(m榮��ӏ9�TP�������ᬳ�Z�w[1{��P���`�s�Kn���HG�3�p��Kᣦ����$2�9v1f5U����Ɲ�x�!~K��[����c�Li�˽ͧҰ�|�G(x�J��)��vk��N{s��?~{�F�N>�|�/�G�q������\uF�OƵ���<}��؇q�٭�p�K�8�RN��I�\00�b�" W,�q$�z��[v��ɶ�1hu�\00Z���"�G�c�����C"���>  ��#�(ÿ��4��$���e$%qb)C9�^������r��h��i%�����`�!��Y�b�;<B���f;�P�����쮎7��r�{A�Ru��ܬ6l&t�M��ۤ^�ӊ�0���$B���C�)Ti{��)9��    刋�U�ζ��,�Tk����'������o�u�L6��Y=x?_�I.C���\ ����S�"0�����Fi�d�f{V�R��V���j#e�s-�Ny�s�3���.���4��X�7:�&u����H%oy��km�(U�O����\B�?N<x�)���j_L'���[%�5ÔZ��J�4��9�hR�\����0�d����M��櫐8�T�P��}�aE[%N<�"v>a��������[�T�ɫ�nV��L|nw��=�,��f�����X��:�]�!�,�� hƩ<t�`�CT��r =O�CiNS��pim�����-��T7����@'�֩��({=>�K���C1<���Ngצ�Zv#꿡?7ec����@�o�Tni�U���.�C���Ý�=1\00\00

Когда я пробую тот же URL-адрес в браузере, он получает JSON. Если я попробую другой URL-адрес в программе, он правильно получит JSON. Это почему?

А также, есть ли какой-либо Java API, чтобы строку JSON я мог преобразовать в какой-то объект?

ПРИМЕЧАНИЕ:

HTTP-клиент Apache — 4.3.3, Apache HTTP Core — 4.3.2, ведение журнала Commons — 1.1.3

ОБНОВЛЕНИЕ 1

Я печатаю ответ. System.out.println(response.toString()); И я получаю следующий вывод.

HTTP/1.1 200 OK [Cache-Control: private, Content-Type: application/json; charset=utf-8, Content-Encoding: gzip, Access-Control-Allow-Origin: *, Access-Control-Allow-Methods: GET, POST, Access-Control-Allow-Credentials: false, Date: Tue, 29 Apr 2014 06:31:45 GMT, Content-Length: 2551]

person iUser    schedule 29.04.2014    source источник
comment
Я чувствую проблему с кодировкой. Вы все читаете как UTF-8 или ISO-8895-1?   -  person Makoto    schedule 29.04.2014
comment
@Makoto Пожалуйста, ознакомьтесь с обновлением 1   -  person iUser    schedule 29.04.2014


Ответы (4)


Возвращаемый контент сжат gzip. вы можете увидеть это в своем выводе ответа:

... Кодировка содержимого: gzip ...

Учитывая, что вы используете клиентскую библиотеку Apache HTTP версии 4.3.3, вам просто нужно сделать следующее:

HttpClient client = HttpClientBuilder.create().build();

Это создаст HttpClient, у которого нет проблем с распаковкой содержимого, и вы получите ожидаемый JSON ( DefaultHttpClient не поддерживает сжатие.)

person Brian Roach    schedule 29.04.2014
comment
Ага. Понятно. Спасибо. - person iUser; 29.04.2014

Похоже, что он сжат, что должно быть обработано HTTPClient; попробуйте использовать конструктор и отключение сжатия.

person Tassos Bassoukos    schedule 29.04.2014
comment
Извините, а можно пример? - person iUser; 29.04.2014
comment
Я должен использовать это вместо HttpClient client = new DefaultHttpClient(); ? - person iUser; 29.04.2014
comment
О.о... как вы думаете? - person Tassos Bassoukos; 29.04.2014
comment
Я удалил свой код и добавил ваш код. Но это все равно. Кодировка содержимого — gzip. Есть проблемы с этим? См. ОБНОВЛЕНИЕ 1 - person iUser; 29.04.2014
comment
Если вы попробуете это, вы обнаружите, что SO очень упрям ​​и будет отправлять только содержимое gzip. Хорошая новость заключается в том, что нет причин отключать сжатие. - person Brian Roach; 29.04.2014

Содержимое заархивировано. Вы можете убедиться в этом, используя

 System.out.println(connection.getContentEncoding());

Чтобы получить содержимое, используйте что-то вроде этого (это версия java.net.URl. Пожалуйста, измените соответственно для httpclient)

GZIPInputStream gs = новый GZIPInputStream(connection.getInputStream());

    BufferedReader in = new BufferedReader(new InputStreamReader(gs));
    String inputLine;
    while ((inputLine = in.readLine()) != null)
        System.out.println(inputLine);
    in.close();
person Hirak    schedule 29.04.2014

Вы должны отображать ответ как UTF-8.

И ваш второй вопрос о библиотеке Джексона. Он может преобразовывать объекты json в объекты Java.

person Basel Darvish    schedule 29.04.2014
comment
Как это сделать? Я знаю, как конвертировать в Object через Джексона. Но мне нужно создать класс для этих результатов. Например, мне нужно создавать классы для Ansers, Users, Qustions и т. д. Поэтому вместо создания, если они предоставляют PI, в котором есть все классы, я могу его использовать. Поэтому я спросил. - person iUser; 29.04.2014