4

我正在尝试使用 StackOverflow 的搜索 API 来搜索问题。

我正在使用此操作来执行解析:

public ActionResult StackExchange(string sq)
{
    string url = "http://api.stackoverflow.com/1.1/search?intitle=" + sq + "&order=desc";    
    var client = new WebClient();
    var response = client.DownloadString(new Uri(url));
    JObject o = JObject.Parse(response);// ERROR
    int total = (int)o["total"];
    return View(total);
}

这是我要解析的 JSON url:

http://api.stackoverflow.com/1.1/search?intitle=asp.net%20custom%20404&order=desc

我正在尝试提取以下数据:

`"total": 3` , 
`"question_timeline_url": "/questions/10868557/timeline",`
`"title": "Asp.net custom 404 not working using Intelligencia rewriter"`

它给出的错误为:Newtonsoft.Json.JsonReaderException:解析值时遇到意外字符:。路径 '',第 0 行,第 0 位置。

异常的原因是什么?我之前用过同样的方法,效果很好。

请建议。

4

2 回答 2

11

尝试以下方法。

使用 NuGet 并引用 JSON.NET 包。我看到你已经这样做了。

编写请求并获得响应。

string url = "http://api.stackoverflow.com/1.1/search?intitle=test&order=desc";
var request = (HttpWebRequest) WebRequest.Create(url);
var response = request.GetResponse();

您从 Stack Exchange API 收到的响应已压缩!您首先需要将其解压缩,然后才能读取 JSON 响应。这就是您收到异常的原因。

让我们创建一个方法来做到这一点。为此,.NET 为我们提供了方便的 GZipStream 类型。

private string ExtractJsonResponse(WebResponse response)
{
    string json;
    using (var outStream = new MemoryStream())
    using (var zipStream = new GZipStream(response.GetResponseStream(),
        CompressionMode.Decompress))
   {
        zipStream.CopyTo(outStream);
        outStream.Seek(0, SeekOrigin.Begin);
        using (var reader = new StreamReader(outStream, Encoding.UTF8))
        {
            json = reader.ReadToEnd();
       }
    }
    return json;
}

现在您可以从响应中提取 JSON 数据。

var json = ExtractJsonResponse(response);

现在您可以解析返回的数据。

JObject o = JObject.Parse(json);
int total = (int)o["total"];

PS:我建议你使用今年早些时候发布的 API 2.0 版本。

https://api.stackexchange.com/docs

于 2012-06-03T09:53:07.223 回答
1

我的第一个猜测是因为 JsonReader 在第 0 行给出异常,位置 0 是编码搞砸了。由于上面的请求在 chrome 开发者工具中显示了以下Content-Type标头

Content-Type:application/json; charset=utf-8

您可以尝试通过 WebClient 的Encoding 属性将 WebClient 使用的编码设置为 utf-8 。

于 2012-06-03T09:49:31.917 回答