2016-11-17 4 views
0

Я пытаюсь потреблять остальное API, но я получаю следующую ошибку:Ошибка потребляя остальные API в .net

Exception Details: Newtonsoft.Json.JsonException: Unexpected JSON token while reading DataTable: StartObject

также, если изменение конечной точки я получаю: System.OutOfMemoryException: Исключение типа «System.OutOfMemoryException» был выброшен

, который указывает на эту строку кода:

var table = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Data.DataTable>(data); 

не совсем уверен, как это исправить? Любой человек может определить, что ошибка или как это исправить ...

спасибо ..

Мой контроллер является:

public async System.Threading.Tasks.Task<ActionResult> About() 
    { 
     string url = "https://restcountries.eu/rest/v1/region/africa"; 

     using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient()) 
     { 
      client.BaseAddress = new Uri(url); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

      System.Net.Http.HttpResponseMessage response = await client.GetAsync(url); 
      if (response.IsSuccessStatusCode) 
      { 
       var data = await response.Content.ReadAsStringAsync(); 
       var table = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Data.DataTable>(data); 

       System.Web.UI.WebControls.GridView gView = new System.Web.UI.WebControls.GridView(); 
       gView.DataSource = table; 
       gView.DataBind(); 
       using (System.IO.StringWriter sw = new System.IO.StringWriter()) 
       { 
        using (System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw)) 
        { 
         gView.RenderControl(htw); 
         ViewBag.ReturnedData = sw.ToString(); 
        } 
       } 
      } 
     } 
     return View(); 
+0

Как выглядит ваш json ('data')? – Liam

+0

Достаточно долго вставлять здесь комментарии, но если вы перейдете на URL-адрес, вы можете увидеть его –

+2

Почему десериализуйте его в виде данных? То, что JSON не похоже на то, что было бы похоже на datatable. – Amy

ответ

0

Вы не должны быть десериализации в DataTable. A DataTable - это общее представление некоторых реляционных данных в памяти. Со следующими десериализации строк кода у вас есть:

var data = await response.Content.ReadAsStringAsync(); 
var table = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Data.DataTable>(data); 

вы задаете ваш код .NET пойти захватить некоторые данные из Интернета и превратить эту строку данных в представление в памяти реляционных данных, когда, на данный момент это действительно только строка символов.

Вы должны создать модель страны со свойствами, возвращаемыми API-интерфейсом, который вы запрашиваете.

Вы можете десериализации эти данные и играть с ним в .NET, делая что-то вроде следующего:

Newtonsoft.Json.JsonConvert.DeserializeObject<IList<MyCountryModel>>(data); 
+0

Точные данные Я ожидаю, что спина: { "ошибка": 0, "Журналы": [{ "ProdLoggerIdx": "1", "OfficeID": "1112222", "Агент": "user1", "CommandSent": "JI2345XY/ОО", "HostResponse": "А-ЗНАК ПОЛНОЕ/10NO", "CommandSentDate": "2016-11-14T12: 14: 01.000Z", «CommandReceivedDate ":" 2016-11-14T12: 14: 01.000Z " }, , поэтому я должен создать модель в соответствии с этими спецификациями, не так ли? как я могу установить поле «Журналы» для этой модели, как-то путать .... –

+0

@RolandoF Logs - это массив строк. Таким образом, свойство является 'string []'. – Amy

+0

Журналы не будут массивом строк. Массив строк будет похож на '[" ProdLoggerIdx "," 1 "," OfficeID "," 1112222 "]', но это JSON. @RolandoF Свойство Logs будет списком типа, который вы создаете, чтобы соответствовать возврату JSON. По внешнему виду эта модель будет иметь свойство ProdLoggerIdx, тип строки, свойство с именем OfficeId, тип строки и т. Д. В нем также есть две DateTimes. Пока вы создаете объект с правильными именами и типами свойств, Json.NET будет обрабатывать сериализацию/десериализацию. – steamrolla

0

После прочтения комментариев, которые я получил, чтобы решить эту проблему модели и определены его, как это, .. ..thanks

public class Log2 
{ 
    public string error { get; set; } 
    public Log3[] Logs { get; set; } 
} 

public class Log3 
{ 
    public string ProdLoggerIdx { get; set; } 
    public string OfficeID { get; set; } 
    public string Agent { get; set; } 
    public string CommandSent { get; set; } 
    public string HostResponse { get; set; } 
    public string CommandSentDate { get; set; } 
    public string CommandReceivedDate { get; set; } 

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