Samir Rawat
Samir Rawat

Reputation: 53

Cannot deserialize the current JSON object (e.g. {"name":"value"})

This is my JSON data

{
    "logInResult": [
        {
            "Name": "yogesh singh",
            "cityName": "",
            "img": "DefaultImage/D_Vp_Men.png",
            "usrId": "374"
        }
    ]
}

and this is my code

public async Task<ActionResult> Index()
{

    HttpClient webClient1 = new HttpClient();
    Uri uri = new Uri("http://m.vinipost.com/service/userprofile.svc/[email protected]&pass=12345");

    HttpResponseMessage response1;

    response1 = await webClient1.GetAsync(uri);

    var jsonString = await response1.Content.ReadAsStringAsync();

    var _Data = JsonConvert.DeserializeObject<List<JClass>>(jsonString);
    foreach (JClass Student in _Data)
    {
        ViewBag.Message += Student.Name + ", ";
    }
    dynamic obj = JsonConvert.DeserializeObject(jsonString);
    ViewBag.Message += obj.data.Name;

    return View();
}

and the error is

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[MvcSumit1.Models.JClass]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path 'logInResult', line 1, position 15.

Upvotes: 2

Views: 36647

Answers (6)

Jay
Jay

Reputation: 327

Convert to collection of object

using Newtonsoft.Json.Linq;

JObject obj = JObject.Parse(jsonString);
JArray arr = (JArray)obj["logInResult"];
IList<JClass> student= arr.ToObject<IList<JClass>>();

return View(student);

Then iterate over it.

IEnumerable<Student>
  @foreach (var item in Model)
 {
   item.Name
   item.CityName
   item.Img
   item.UsrId
 }

Upvotes: 0

Saurabh Chauhan
Saurabh Chauhan

Reputation: 144

I have faced the same issue, just wanted to point out when there is an array or list exist in JSON like in logInResults is a list of a type, so while deserializing JSON convert is not able to understand that, so what you can do it create your model in this way.

Class  giveName
{
  givenName[] logInResult {get;set;}         // can use list also will work fine
}

public class giveName2
{
   public string Name {get;set;}
   public string cityName {get;set;}
   public string img {get;set;}
   public string usrId {get;set;}
}

i will tell you why because see the first curly braces of your json object for that to work, you must have created a type(class) which has a property named logInResult, in the same way object of which the list is made up has to be provided a type and then the properties matching with list items

Note: giveName and giveName2 is the name you can give yourself it wont matter with class name

Upvotes: 0

Krunal Mevada
Krunal Mevada

Reputation: 1655

You can't directly deserialize from your API response using JsonConvert.DeserializeObject.

Try this below code :

JObject jsonResponse = JObject.Parse(jsonString);
JObject objResponse = (JObject)jsonResponse["logInResult"];
Dictionary<string, JArray> _Data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, JArray>>(objResponse.ToString());

Hope this will help you.

Upvotes: 12

Jack Miller
Jack Miller

Reputation: 7647

Your question seems to be a duplicate of: Using JsonConvert.DeserializeObject to deserialize Json to a C# POCO class


You are trying to deserialize your JSON object into an JSON array.

Store just the content of logInResult into jsonString, that is:

[{"Name":"yogesh singh","cityName":"","img":"DefaultImage\/D_Vp_Men.png","usrId":"374"}]

This of course assumes that you got your JClass correct in the first place.

Upvotes: 3

garryp
garryp

Reputation: 5766

You're C# code thinks it is reading this:

[
    {
        "Name": "yogesh singh",
        "cityName": "",
        "img": "DefaultImage/D_Vp_Men.png",
        "usrId": "374"
    }
]

i.e. an array of objects, when in fact it is reading an object with a property logInResult, which is an array.

Upvotes: 0

typie34
typie34

Reputation: 358

You should create the following classes in order to map your json data to actual classes.

    public class LogInResult
{
    public string Name { get; set; }
    public string cityName { get; set; }
    public string img { get; set; }
    public string usrId { get; set; }
}

public class RootObject
{
    public List<LogInResult> logInResult { get; set; }
}

You can then store the RootObject for further processing:

var result = JsonConvert.DeserializeObject<RootObject>(jsonString);

By using the getter for the list, you can get the list and iterate it as usual.

Upvotes: 9

Related Questions