我编写了一个小程序来分析StackExchange API中的配置文件数据,但是api会向我发送unsarse- / unreadable数据。
收到的数据(使用c#自行下载)
\ u001f \ B \ 0 \ 0 \ 0 \ 0 \ 0 \ U0004 \ 0mRMo0 \ F /:d $ C'^ {/ \ u0006 \ u0018G> \ I \ u0015 \ U0004݀d取代; GRL'o \ u0004G%JP \ u001c-EM> 0X BM〜\ u0018tk \ u0014M] rdLGv0〜FJ = 1 \ u00031I> kTRA \“(/ +; NL \ u0018ħ\ u0014P藄XaLw#3 \ U0002 + \ u007f \ u0010 \ u000fp】v \ u007f \吨 ڧ \nf “\ u0018 \u0014eƺ _ 1x#j ^- c AX\t \u001aT @ qj \u001aU7 \ u0014 \”\一个^ \ b#\ u001eQG%Y \吨חq00K \ AV \ u0011 {ظ\ u0005 \“\ u001d + | \ u007f” \ u0016〜8 \ u007f \ U0001-H] O \ u007fVo \ u007f \ U0001〜Y \ U0003 \ U0002 \ 0 \ 0
想要的数据:(从我的浏览器中复制粘贴)
{ “项”:[{ “badge_counts”,{ “青铜”:987, “银”:654, “金”:321}, “ACCOUNT_ID” 123456789 “is_employee”:假 “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, “CREATION_DATE”:1109670518, “USER_TYPE”: “注册”, “USER_ID” 123456789 “accept_rate”:0, “位置”: “澳大利亚”, “WEBSITE_URL”: “http://example.org”, “链接”: “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 :(得分:10)
在我看来,输出是压缩的。您可以使用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 :(得分:1)