Andreas Grech
Andreas Grech

Reputation: 108030

Deserializing a simple JSON array with DataContractJsonSerializer

I'm sure this question has been asked over and over again, but for some reason, I still can't manage to get this to work.

I want to deserialize a JSON object that contains a single member; a string array:

{"results" : ["a", "b"]}

This is the class that I'm trying to deserialize into:

public class Whatever {
    [DataMember(Name = "results")]
    public string[] Results { get; protected set; }
}

And this is the Deserialize method:

private static T Deserialize<T>(string json)
{
    var instance = Activator.CreateInstance<T>();
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        var serializer = new DataContractJsonSerializer(instance.GetType());
        return (T)serializer.ReadObject(ms);
    }
}

A call like Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}") is returning an initialized instance of Whatever but the Results array is staying null.

Is there something wrong with the structure of Whatever?

Upvotes: 17

Views: 52047

Answers (2)

mercredo
mercredo

Reputation: 158

i know, the post is quite barred; but: also possible to directly return a list of class-objects, if you got an jsonarray-string of information to bind to a dataclass; i.e.:

List<SomeDataClass> filesToMove = new List<SomeDataClass>();

public T deserializeJSON<T>(string json)
{
    var instance = typeof(T);
    var lst = new List<SomeDataClass>();

     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
     {
         var deserializer = new DataContractJsonSerializer(instance);
         return (T)deserializer.ReadObject(ms);
     }
}

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]";
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString);
Console.WriteLine(filesToMove[1].ID); // returns 16

with dataclass SomeDataClass.cs:

[DataContract]
class SomeDataClass
{
    [DataMember]
    public int ID { get; set; }        
}

Upvotes: 11

Andreas Grech
Andreas Grech

Reputation: 108030

Ah, after posting this I realized that I was missing the DataContract attribute decoration on Whatever:

[DataContract]
public class Whatever {
    [DataMember(Name = "results")]
    public string[] Results { get; protected set; }
}

Now it works fine.

Upvotes: 16

Related Questions