programmer101
programmer101

Reputation: 41

Json Array cannot be deserialized

I would like to start by saying that I am not a developer and this is my very first time writing a code to this extend of complication (at least to me). Any help/guidance would be much appreciated.

The idea of this program is to retrieve the employee user ID (or signature) from an API URL once the name has been entered.

I have a JSON String

[{"signature":"JDOW","firstName":"Jane","fullName":"Dow, Jane","lastName":"Dow"}]

I am trying to deserialize it to a collection. But I am getting an error. Can somebody direct me to the right way to fix this?

namespace TimeSheet_Try11_Models
{
    public class Employeename
    {
        [JsonProperty("Signature")]
        public string Signature { get; set; }

        [JsonProperty("FirstName")]
        public string FirstName { get; set; }
        
        [JsonProperty("FullName")]
        public string FullName { get; set; }
       
        [JsonProperty("LastName")]
        public string LastName { get; set; }
    } 
}

I a trying to convert using the following code:

uri = StaticStrings.UrlIora + name;
var response = wc.DownloadString(uri);

Employeename status = JsonConvert.DeserializeObject<Employeename>(response);

The error I am getting is:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'TimeSheet_Try11_Models.Employeename' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

Upvotes: 0

Views: 235

Answers (2)

Sh.Imran
Sh.Imran

Reputation: 1033

Deserialize the Json data for collection as:

var status = JsonConvert.DeserializeObject<List<Employeename>>(response);

or

List<Employeename> status = JsonConvert.DeserializeObject<List<Employeename>>(response);

Another thing is that, no need to use attribute [JsonProperty("anyProperty")] with your properties. Json can be deserialized without using it in attributes.

After getting the deserialzed data in status object, any value can be fetched from that object as:

string signature = status.Select(js => js.Signature).First();

Similarly other values can also be taken from the status.

Upvotes: 1

Luke Storry
Luke Storry

Reputation: 6732

Your JSON string has square brackets ([]) around it, which means it is a collection of items. This is why the Deserialiser is erroring.

You need to either remove those brackets to give just one employee object in the input string, or tell DeserializeObject that it is a List you are deserialising.

var converted = JsonConvert.DeserializeObject<List<Employeename>>(response);

Working Fiddle here

Upvotes: 1

Related Questions