Search code examples
c#asp.net-web-apijson.netjson-deserialization

Json deserialize error c# mvc


Controller
{
namespace WebApplication10.Controllers
{
    public class Default1Controller : ApiController
    {
        [ResponseType(typeof(WeatherItem))]
        public WeatherItem Post(Wcall call)
        {

            string apikey = //MYAPIKEY;
            string url = string.Format("http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&units=metric&cnt=1&APPID={1}", call.city1, apikey);
            WebClient A1 = new WebClient();
            string dataweather = A1.DownloadString(url);

            WeatherItem a2 = JsonConvert.DeserializeObject<WeatherItem>(dataweather);
            string przyklad = a2.list.pressure;
            return a2;
        }
    }
}
}
class
{
namespace WebApplication10.Models
{
    public class WeatherItem
    {
        public List list { get; set; }
        public string cod { get; set; }
        public string message { get; set; }
        public int cnt { get; set; }
        //public List<City> city { get; set; }       
    }
    public class List
    {
        public int dt { get; set; }
       // public List<Temp> temp { get; set; }
        public string pressure { get; set; }
        public int humidity { get; set; }
       // public List<Weather> weather { get; set; }
        public string speed { get; set; }
        public string deg { get; set; }
        public string clauds { get; set; }
        public int rain { get; set; }
    }
    public class Wcall
    {
        public string city1 { get; set; }
        public string street { get; set; }
    }
    public class City
    {
        public int id { get; set; }
        public string name { get; set; }
        //public List<Coords> coords { get; set; }
        public string country { get; set; }
        public int population { get; set; }
    }
    public class Coords
    {
        public string lon { get; set; }
        public string lat { get; set; }
    }
    public class Temp
    {
        public string day { get; set; }
        public string min { get; set; }
        public string max { get; set; }
        public string night { get; set; }
        public string eve { get; set; }
        public string morn { get; set; }
    }
    public class Weather
    {
        public int id { get; set; }
        public string main { get; set; }
        public string description { get; set; }
        public string icon { get; set; }
    }
}
}

Exception:An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code Additional information: Cannot deserialize the current JSON object (e.g. {"name":"value"})...

Sorry for my english, someone have a idea what i doing wrong?


Solution

  • Just a quick tip, in visual studio, there's a built-in feature to convert json to C# model.

    You can find it in Edit\Paste Special\Parse Json as classes

    About your question, your model is invalid, try this.

    public class WeatherItem
    {
        public City city { get; set; }
        public string cod { get; set; }
        public float message { get; set; }
        public int cnt { get; set; }
        public List[] list { get; set; }
    }
    
    public class City
    {
        public int id { get; set; }
        public string name { get; set; }
        public Coord coord { get; set; }
        public string country { get; set; }
        public int population { get; set; }
    }
    
    public class Coord
    {
        public float lon { get; set; }
        public float lat { get; set; }
    }
    
    public class List
    {
        public int dt { get; set; }
        public Temp temp { get; set; }
        public float pressure { get; set; }
        public int humidity { get; set; }
        public Weather[] weather { get; set; }
        public float speed { get; set; }
        public int deg { get; set; }
        public int clouds { get; set; }
        public float rain { get; set; }
    }
    
    public class Temp
    {
        public float day { get; set; }
        public float min { get; set; }
        public float max { get; set; }
        public float night { get; set; }
        public float eve { get; set; }
        public float morn { get; set; }
    }
    
    public class Weather
    {
        public int id { get; set; }
        public string main { get; set; }
        public string description { get; set; }
        public string icon { get; set; }
    }