Unparseable StackExchange API response
Asked Answered
G

2

9

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?

Gilthead answered 22/12, 2015 at 14:26 Comment(4)
FWIW, try{}finally{} blocks without catch{} blocks are perfectly valid, if all you're doing is rethrowing the exception.Borlase
What is the URL you are accessing?Semiporcelain
@PatrickHofman api.stackexchange.com/2.2/users/4000926?site=stackoverflowGilthead
@JamesThorpe just added the throw section for debugging/error search, normally empty --- but thanks.Gilthead
S
11

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;
}
Semiporcelain answered 22/12, 2015 at 14:34 Comment(0)
B
2

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

enter image description here

Basketry answered 22/12, 2015 at 15:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.