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