Reputation: 108030
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
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
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