2015-12-22 2 views
8

Я написал небольшую программу для анализа данных моего профиля из API StackExchange, но api возвращает мне данные unparse-/unreadable.Непрозрачный ответ API-интерфейса StackExchange

Данные, полученные: (самостоятельно загрузить с помощью C#)

\ u001f \ Ъ \ 0 \ 0 \ 0 \ 0 \ 0 \ u0004 \ 0mRMo0 \ F /: D $ С '^ {/ \ u0006 \ u0018G> \ I \ u0015 \ u0004 ݀ D> GRL'o \ u0004G% JP \ u001c-Em> 0Xbm ~ \ u0018tk \ u0014M] rdLGv0 ~ Fj = 1 \ u00031I> kTRA \ "(/+.;Nl\u0018?h\u0014P 藄 XaLw # 3 \ u0002 + \ u007f \ u0010 \ u000f p ] v \ u007f \ t ڧ \ nf "\ u0018 \ u0014eƺ _ 1x # j^- c AX \ t \ u001aT @qj \ u001aU7 \ u0014 \ "\ а^\ б # \ u001e QG% г \ т ח q00K \ ау \ u0011 {ظ \ u0005 \ "\ u001d + | \ u007f '\ u0016 ~ 8 \ u007f \ u0001-ч] O \ u007fVo \ u007f \ u0001 ~ Y \ u0003 \ u0002 \ 0 \ 0

данных хотел: (копия-вставили из браузера)

{"items": [{"badge_counts", {"bronze": 987, "silver": 654, "gold": 321}, "account_id": 123456789, "is_employee": false, "last_modified_date": 1250612752 , "last_access_date": 1250540770, "возраст": 0, "reputation_change_year": 987, "reputation_change_quarter": 654, "reputation_change_month": 321, "reputation_change_week": 98, "reputation_change_day": 76, "репутация": 9876,» CREATIO n_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": "имя пользователя"}], "has_more" ложь "quota_max": 300, "quota_remaining": 300}

Я написал этот метод (расширение) чтобы загрузить строку из интернета:

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; 
} 

Я тогда искал в интернете и нашел способ загрузки строки, используя некоторые другие тактики:

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; 
} 

Но оба метода возвращают те же (непрочитанные/непроверяемые) данные.

Как получить читаемые данные из API? Что-то не хватает?

+0

FWIW, 'попробовать {} наконец {}' блоки без 'уловом {}' блоки вполне допустимы, если все, что вы делаете, это перестройка исключения. –

+0

Каков URL, к которому вы обращаетесь? –

+0

@PatrickHofman http://api.stackexchange.com/2.2/users/4000926?site=stackoverflow – cramopy

ответ

9

Мне кажется, что выход сжат. Вы можете использовать GZipStream, который можно найти в System.IO.Compression, чтобы распаковать байты.

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; 
} 
1

как вы можете видеть - кодирование вы использовали неправильно -

enter image description here

Смежные вопросы