A quick note on interfacing with JSON services via C#
I'm sure there are 100s of ways to manually create classes for JSON objects and then decipher them upon web-service response, but I've just stumbled across a fantastic site called 'json 2 csharp' that creates the classes for you. Just slap in your response (try to get a fully-fleshed out one with as fewer nulls as possible) and it'll generate the class structure.
You can then use the NewtonSoft JsonConvert deserialiser to populate it.
An example
Here's a link: jsontest 'date' example. It produces the following response:
{ "time": "05:13:02 AM", "milliseconds_since_epoch": 1425532382121, "date": "03-05-2015" }
From here, you just copy the entire response and paste it into the text field on the json2csharp site.
Hit 'Generate' and the site will spit out the following:
public class RootObject //rename this! { public string time { get; set; } public long milliseconds_since_epoch { get; set; } public string date { get; set; } }
Note that 'RootObject' is a little boring... rename it to 'DateResponse'
Add a helper library to your code to easily pull JSON responses (and POST):
public static class JSONUtilities { public static string GetJSON(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); try { WebResponse response = request.GetResponse(); using (Stream responseStream = response.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); return reader.ReadToEnd(); } } catch (WebException ex) { WebResponse errorResponse = ex.Response; using (Stream responseStream = errorResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); Console.WriteLine(reader.ReadToEnd()); } throw; } } public static Tuple<HttpStatusCode, String> PostJSON(string url, string jsonContent) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(jsonContent); request.ContentLength = byteArray.Length; request.ContentType = @"application/json"; using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } long length = 0; try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { length = response.ContentLength; using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding)) { return new Tuple<HttpStatusCode, string>(response.StatusCode, reader.ReadToEnd()); } } } catch (WebException ex) { // Log exception and throw as for GET example above Console.WriteLine("ERROR: " + ex.Message); throw ex; } } }
And now you can bring it all together:
private bool Get() { var result = JSONUtilities.GetJSON("http://date.jsontest.com/"); var dateResponse = JsonConvert.DeserializeObject<DateResponse>(result); Console.WriteLine("Got Response: " + dateResponse.date + " [" + dateResponse.time + "]"); }
Too easy!