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

これが私が解析しようとしているJSONURLです:

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();

StackExchangeAPIから受け取る応答はgzipで圧縮されています。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 に答える