Search code examples
c#json-deserializationjavascriptserializer

C# JavaScriptSerializer.Deserialize returning null


Struggling to deserialize a JSON string, i am just getting null returned form the serializer.

JSON is valid, I have checked.

My eyes are going boggledy-boop from staring at this for so log now, so hoping that someone with more experience of the serializer than me, could spot something 'obvious' !?

Thanks for any tips :)

RootObject[] jsonResponse = null;
try
{
    if (httpWResp.StatusCode == HttpStatusCode.OK)
    {
        Stream responseStream = httpWResp.GetResponseStream();
        string jsonString = null;
        using (StreamReader reader = new StreamReader(responseStream))
        {
            jsonString = reader.ReadToEnd().Replace("\\", "");
            reader.Close();
        }
        JavaScriptSerializer sr = new JavaScriptSerializer();
        jsonResponse = sr.Deserialize<RootObject[]>(jsonString);

Json is thus :

{
    "Tags":[
        {
            "Name":"Requestable",
            "TotalOccurrences":1,
            "SizePercentage":0.33333333333333331
        },
        {"Name":"Generic","TotalOccurrences":1,"SizePercentage":0.33333333333333331},
        {"Name":"YYYYYYY","TotalOccurrences":1,"SizePercentage":0.33333333333333331}
    ],
    "Data":[
        {
            "LogonName":"xxxxxxxxxxxxxx",
            "NetBiosName":"YYYYYYY",
            "FriendlyName":"xxxxxxxx",
            "Description":"xxxxxxxxxx",
            "GroupTypeName":"zzzzzzzzz",
            "AllowJoinRequests":true,
            "RiskFactorTotal":null,
            "IsHighSecurityGroup":false,
            "Email":null,
            "DistinguishedName":"xxx,yyy,xxx",
            "ResourceID":12345,
            "GroupID":6789,
            "ValidUntil":null,
            "IsMailEnabled":false,
            "Notes":null,
            "RiskFactorLastCalculated":null
        }
    ],
    "OutParameters":[
        {"Name":"totalCount","Value":1}
    ]
}

And my classes are thus :

    public class RootObject
    {
        public List<Tag> Tags { get; set; }
        public List<Datum> Data { get; set; }
        public List<OutParameter> OutParameters { get; set; }
    }
    public class Tag
    {
        public string Name { get; set; }
        public int TotalOccurrences { get; set; }
        public double SizePercentage { get; set; }
    }

    public class Datum
    {
        public string LogonName { get; set; }
        public string NetBiosName { get; set; }
        public string FriendlyName { get; set; }
        public string Description { get; set; }
        public string GroupTypeName { get; set; }
        public string AllowJoinRequests { get; set; }
        public string RiskFactorTotal { get; set; }
        public string IsHighSecurityGroup { get; set; }
        public string Email { get; set; }
        public string DistinguishedName { get; set; }
        public int ResourceID { get; set; }
        public int GroupID { get; set; }
        public string ValidUntil { get; set; }
        public string IsMailEnabled { get; set; }
        public string Notes { get; set; }
        public string RiskFactorLastCalculated { get; set; }
    }

    public class OutParameter
    {
        public string Name { get; set; }
        public int Value { get; set; }
    }

Solution

  • Please note that there are 3 bool properties which you have defined as string: AllowJoinRequests, IsHighSecurityGroup, IsMailEnabled:

    public partial class RootObject
    {
        [JsonProperty("Tags")]
        public List<Tag> Tags { get; set; }
    
        [JsonProperty("Data")]
        public List<Datum> Data { get; set; }
    
        [JsonProperty("OutParameters")]
        public List<OutParameter> OutParameters { get; set; }
    }
    
    public partial class Datum
    {
        [JsonProperty("LogonName")]
        public string LogonName { get; set; }
    
        [JsonProperty("NetBiosName")]
        public string NetBiosName { get; set; }
    
        [JsonProperty("FriendlyName")]
        public string FriendlyName { get; set; }
    
        [JsonProperty("Description")]
        public string Description { get; set; }
    
        [JsonProperty("GroupTypeName")]
        public string GroupTypeName { get; set; }
    
        [JsonProperty("AllowJoinRequests")]
        public bool AllowJoinRequests { get; set; }
    
        [JsonProperty("RiskFactorTotal")]
        public object RiskFactorTotal { get; set; }
    
        [JsonProperty("IsHighSecurityGroup")]
        public bool IsHighSecurityGroup { get; set; }
    
        [JsonProperty("Email")]
        public object Email { get; set; }
    
        [JsonProperty("DistinguishedName")]
        public string DistinguishedName { get; set; }
    
        [JsonProperty("ResourceID")]
        public long ResourceID { get; set; }
    
        [JsonProperty("GroupID")]
        public long GroupID { get; set; }
    
        [JsonProperty("ValidUntil")]
        public object ValidUntil { get; set; }
    
        [JsonProperty("IsMailEnabled")]
        public bool IsMailEnabled { get; set; }
    
        [JsonProperty("Notes")]
        public object Notes { get; set; }
    
        [JsonProperty("RiskFactorLastCalculated")]
        public object RiskFactorLastCalculated { get; set; }
    }
    
    public partial class OutParameter
    {
        [JsonProperty("Name")]
        public string Name { get; set; }
    
        [JsonProperty("Value")]
        public long Value { get; set; }
    }
    
    public partial class Tag
    {
        [JsonProperty("Name")]
        public string Name { get; set; }
    
        [JsonProperty("TotalOccurrences")]
        public long TotalOccurrences { get; set; }
    
        [JsonProperty("SizePercentage")]
        public double SizePercentage { get; set; }
    }
    

    Please note that for properties that are defined as object below, you need some Json string that actually have them.

    EDIT: Second problem with your code is that while your sample json string is not an array, you are trying to deserialize it as such. try changing this line:

    jsonResponse = sr.Deserialize<RootObject[]>(jsonString);
    

    to this:

    jsonResponse = sr.Deserialize<RootObject>(jsonString);