Unparseable StackExchange API response

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-01 01:22:44

问题


I've written a small program to analyze my profile data from the StackExchange API, but the api returns unparse-/unreadable data to me.

Data received: (self downloaded using c#)

\u001f�\b\0\0\0\0\0\u0004\0mRMo�0\f�/:�d$�c˱�'�^{/\u0006��\u0018G�>\I��\u0015���\u0004݀�D>�GR�L'���o��\u0004�G���%JP\u001c����-��Em>0���X�bm~�\u0018tk��\u0014�M]r�dLG�v0~Fj=���1\u00031I�>kTRA\"(/+.����;Nl\u0018�?h�\u0014��P藄�X�aL��w���#�3\u0002��+�\u007f���\u0010���\u000f�p�]��v\u007f���\t��ڧ�\nf��״\u0018\u0014eƺ�_��1x#j^-�c� � AX\t���\u001aT��@qj\u001aU7�����\u0014\"\a^\b�#\u001e��QG��%�y�\t�ח������q00K\av\u0011{ظ���\u0005\"\u001d+|\u007f���'�\u0016~��8\u007f�\u0001-h�]O\u007fV�o\u007f\u0001~Y\u0003��\u0002\0\0

Data wanted: (copy-pasted from my browser)

{"items":[{"badge_counts",{"bronze":987,"silver":654,"gold":321},"account_id":123456789,"is_employee":false,"last_modified_date":1250612752,"last_access_date":1250540770,"age":0,"reputation_change_year":987,"reputation_change_quarter":654,"reputation_change_month":321,"reputation_change_week":98,"reputation_change_day":76,"reputation":9876,"creation_date":1109670518,"user_type":"registered","user_id":123456789,"accept_rate":0,"location":"Australia","website_url":"http://example.org","link":"http://example.org/username","profile_image":"http://example.org/username/icon.png","display_name":"username"}],"has_more":false,"quota_max":300,"quota_remaining":300}

I've written this (extension) method to download a string from the internet:

public static string DownloadString(this string link)
{
    WebClient wc = null;
    string s = null;
    try
    {
        wc = new WebClient();
        wc.Encoding = Encoding.UTF8;
        s = wc.DownloadString(link);
        return s;
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        if (wc != null)
        {
            wc.Dispose();
        }
    }
    return null;
}

I've then searched the internet and found a method for downloading strings, using some other tactics:

public string DownloadString2(string link)
{
    WebClient client = new WebClient();
    client.Encoding = Encoding.UTF8;
    Stream data = client.OpenRead(link);
    StreamReader reader = new StreamReader(data);
    string s = reader.ReadToEnd();
    data.Close();
    reader.Close();
    return s;
}

But both methods return the same (unread-/unparseable) data.

How can I get readable data from the API? Is there anything missing?


回答1:


It seems to me that the output is compressed. You could use the GZipStream which can be found in System.IO.Compression in order to decompress the bytes.

public static string DownloadString(this string link)
{
    WebClient wc = null;
    try
    {
        wc = new WebClient();
        wc.Encoding = Encoding.UTF8;
        byte[] b = wc.DownloadData(link);

        MemoryStream output = new MemoryStream();
        using (GZipStream g = new GZipStream(new MemoryStream(b), CompressionMode.Decompress))
        {
            g.CopyTo(output);
        }

        return Encoding.UTF8.GetString(output.ToArray());
    }
    catch
    {

    }
    finally
    {
        if (wc != null)
        {
            wc.Dispose();
        }
    }
    return null;
}



回答2:


as you can see - the encoding you were using is wrong -



来源:https://stackoverflow.com/questions/34418076/unparseable-stackexchange-api-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!