I'm having trouble deserializing a JSON array of mixed types using the DataContractJsonSerializer class. I've spent a bunch of time looking for a solution to no avail, so I thought I'd go ahead and ask here.
Basically, I am getting a JSON string like the one below. I'd like to get the array to deserialize into an List where position 0 has an Int32, position 1 has a String, and position 2 has an instance of my custom class.
[
2,
"Mr. Smith",
{
"num":169,
"name":"main street",
"state":66
}
]
If I just create a serialize like so:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>))
I actually get an Int32 at position 0 and a String at position 1. However at position 2 I just get a null object.
Does anyone know if what I am trying to do is even possible? I have no control over the structure of the JSON that I'm consuming. I'd like to accomplish this without using third party assemblies if possible.
Mike,
The problem is that during deserialization, the JSON deserializer does not know what type to deserialize the element at position 2 to.
You need to provide a "__type" hint. You can get the __type hint for thie particular type by actually serializing it out to JSON in a polymorphic situation, and seeing what type hint gets emitted.
For more info, see http://msdn.microsoft.com/en-us/library/bb412170.aspx. Pay particular attention to the sections "Collections Assigned to Object" and "Preserving Type Information"
You have to make a class that reproduces the json structure like this:
Decorate the class and its properties with the "DataContract" and "DataMember" attributes. Then in your deserializing code use the class you have created as in the following example