JObject throws me an error when I try to get the result of a JSON

0

I'm calling a Rest API. When I call it, I drop it and it gives me the following error.

  

Error reading JObject from JsonReader. Current JsonReader item is not   an object: StartArray en la linea JObject.Parse (resultWebService.ToString ());

Do you know how I should fix it?

   IList<Parameters> searchResultsFromJason = new List<Parameters>();

    string resultJSonRequest = "";

    using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)

    using (var reader = new StreamReader(resp.GetResponseStream()))
    {
        var result = reader.ReadToEnd();

        string resultWebService = Convert.ToString(result);

        JObject JasonResultList = JObject.Parse(resultWebService.ToString());

        resultJSonRequest = resultWebService;

        IList<JToken> results = JasonResultList["data"].ToList();

        IList<Parameters> searchResults = new List<Parameters>();

        searchResultsFromJason = searchResults;

        foreach (JToken resultJAson in results)
        {
            Parameters searchResult = resultJAson.ToObject<Parameters>();
            searchResults.Add(searchResult);

        }
    }
    
asked by user3790916 13.08.2018 в 16:39
source

2 answers

0

Personally I use JToken, I think it gives me more flexibility when accessing dynamic properties. Using the NewtonSoft converter (which I believe is the new JSON.NET) you can use the following

IList<Parameters> searchResultsFromJason = new List<Parameters>();
string resultJSonRequest = "";
using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
using (var reader = new StreamReader(resp.GetResponseStream()))
{
    var result = reader.ReadToEnd();
    string resultWebService = Convert.ToString(result);        

    /*La opción sencilla es convertir a JToken*/        
    var JasonResultList = Newtonsoft.Json.JsonConvert.DeserializeObject<JToken>(resultWebService.ToString());

    resultJSonRequest = resultWebService;
    IList<JToken> results = SelectToken("data").ToObject<List<JToken>>();
    IList<Parameters> searchResults = new List<Parameters>();
    searchResultsFromJason = searchResults;
    foreach (JToken resultJAson in results)
    {
        Parameters searchResult = resultJAson.ToObject<Parameters>();
        searchResults.Add(searchResult);
    }
}

Suddenly it helps to do the casting directly thanks to the kindness of JToken:

IList<Parameters> searchResultsFromJason = new List<Parameters>();
string resultJSonRequest = "";
using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
using (var reader = new StreamReader(resp.GetResponseStream()))
{
    var result = reader.ReadToEnd();
    string resultWebService = Convert.ToString(result);        

    /*La opción sencilla es convertir a JToken*/        
    var JasonResultList = Newtonsoft.Json.JsonConvert.DeserializeObject<JToken>(resultWebService.ToString());

    resultJSonRequest = resultWebService;
    IList<JToken> searchResults = SelectToken("data").ToObject<List<Parameters>>();
    searchResultsFromJason = searchResults;
}
    
answered by 14.08.2018 / 00:34
source
-1

Desemple your variable resultWebService in a model:

clas Modelo
{
 public string variable { get; set; }
}
Modelo info = new Modelo();

result = reader.ReadToEnd();
var obj = JsonConvert.DeserializeObject<object>(result);
string data = Convert.ToString(obj);
info = JsonConvert.DeserializeObject<Modelo>(data);

You can also go through that collection called info with a foreach .

    
answered by 13.08.2018 в 17:44