Вопрос по asp.net-mvc, c#, json, asp.net, parsing – Ошибка анализа значений JSON в ASP.NET MVC?

4

Я пытаюсь использовать поисковый API StackOverflow для поиска вопросов.

Я использую это действие для выполнения анализа:

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

Вот URL JSON, который я пытаюсь проанализировать:

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: Unexpected character encountered while parsing value: . Path '', line 0, position 0.

В чем может быть причина исключения? Я использовал тот же метод ранее, и он работал нормально.

Пожалуйста, предложите.

Ваш Ответ

2   ответа
10

Попробуйте следующий подход.

Используйте 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"];

В прошлом году я написал сообщение в блоге о том, как работать со API Stack Exchange версии 1.1.

http://cgeers.com/2011/10/02/stack-exchange-api/

PS: Я бы порекомендовал вам использовать версию 2.0 API, которая была выпущена ранее в этом году.

https://api.stackexchange.com/docs

Спасибо .. Это работало отлично ... А также большое спасибо за предложения об API 2.0, это здорово :-) Man8Blue
Привет, я попробовал этот URL =answers.yahooapis.com/AnswersService/V1/… и он показал ошибку ... Магическое число в заголовке GZip не правильно. Я знаю, что это как-то связано с форматом JSON. Но как это уладить? Man8Blue
1

Мое первое предположение, поскольку JsonReader выдает исключение в строке 0, позиция 0 состоит в том, что что-то не так с кодировкой. Поскольку запрос выше показывает следующееContent-Type заголовок в инструментах разработчика Chrome

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

Вы можете попытаться установить кодировку, которую использует WebClient, на utf-8 через WebClient.Свойство кодирования.

Похожие вопросы