Yesterday I wrote about an Simple API server for IP Address Information Lookup that I had created in Node.js. This server produces a JSON result that looks like this for IP address 8.8.8.8:
{ "city":{ "geoname_id":5375480, "names":{ "en":"Mountain View", ... } }, "continent":{ "code":"NA", "geoname_id":6255149, "names":{ "de":"Nordamerika", "en":"North America", ... } }, "country":{ "geoname_id":6252001, "iso_code":"US", "names":{ "en":"United States", ... } }, "location":{ "latitude":37.386, "longitude":-122.0838, "metro_code":807, "time_zone":"America/Los_Angeles" }, "postal":{ "code":"94040" }, "registered_country":{ "geoname_id":6252001, "iso_code":"US", "names":{ "en":"United States", ... } }, "subdivisions":[ { "geoname_id":5332921, "iso_code":"CA", "names":{ "en":"California", ... } } ] }
I wanted to consume this end-point in a C# application. A quick search for solutions on how to consume a JSON result from a REST service showed some very complicated ways of doing this. This is a simple solution that I came up with:
// A simple C# class to get the details of an IP address public class IpApi { public IPInfo GetIPInfo(string ip) { // Create the URL for the REST endpoint string url = "http://localhost:3000/ip/" + ip; // Create a .Net WebClient object WebClient wc = new WebClient(); // Get the string result from the REST endpoint string json = wc.DownloadString(url); // Use Newtonsoft JsonConvert class and its static // DeserializeObject method to parse the string into // a .Net object return JsonConvert.DeserializeObject<IPInfo>(json); } } // The following classes create the JSON object graph hierarchy // in static classes. It's a bit tedious looking at the JSON // object and typing these out. I'd imagine that if you're // doing this a lot you could write a tool to generate these // classes using the JSON as input. Or perhaps there's already // a tool that does this? public class Names { // I didn't need the pt-BR and zh-CN key/values from the // names so I didn't bother looking up how JsonCovert maps // those. public string de, en, fr, ja, ru; } public class City { public Names names; public int geoname_id; } public class Continent { public string code; public Names names; public int geoname_id; } public class Country { public string iso_code; public Names names; public int geoname_id; } public class Location { public decimal latitude; public decimal longitude; public int metro_code; public string time_zone; } public class Postal { public string code; } public class IPInfo { public City city; public Continent continent; public Country country; public Location location; public Postal postal; public Country registered_country; public Country[] subdivisions; }
No comments:
Post a Comment