I’m using JSON.Net to try and deserialize some survey responses from SurveyGizmo.
Here’s a snapshot of the data I’m reading in:
{"result_ok":true,
"total_count":"44",
"page":1,
"total_pages":1,
"results_per_page":50,
"data":[
{"id":"1",
"contact_id":"",
"status":"Complete",
"is_test_data":"0",
"datesubmitted":"2011-11-13 22:26:53",
"[question(59)]":"11\/12\/2011",
"[question(60)]":"06:15 pm",
"[question(62)]":"72",
"[question(63)]":"One",
"[question(69), option(10196)]":"10",
I’ve setup a class as far as datesubmitted but I’m not sure how to setup the class to deserialize the questions given that the amount of questions will change? I also need to capture the option if it’s present.
I’m using this code to use the JSON.NET Deserialize function:
Dim responses As Responses = JsonConvert.DeserializeObject(Of Responses)(fcontents)
Classes:
Public Class Responses
Public Property result_OK As Boolean
Public Property total_count As Integer
Public Property page As Integer
Public Property total_pages As Integer
Public Property results_per_page As Integer
Public Overridable Property data As List(Of surveyresponse)
End Class
Public Class SurveyResponse
Public Property id As Integer
Public Property status As String
Public Property datesubmitted As Date
End Class
This trick to support totally crazy mappings is to use
JsonConverterand completely replace the parsing for that object, (I apologize for the C#, but I’m no good at VB syntax):Now obviously there’s a lot more you would want to do to get this really robust, but this gives you the basics of how to do it. There are more lightweight alternatives if you simply need to change property names (either
JsonPropertyAttributeor overridingDefaultContractResolver.ResolvePropertyName(), but this gives you full control.