Unparseable StackExchange API response

2019-02-17 01:23发布

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?

2条回答
Anthone
2楼-- · 2019-02-17 02:00

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

enter image description here

查看更多
欢心
3楼-- · 2019-02-17 02:06

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;
}
查看更多
登录 后发表回答