0

So I'm trying to get distance between two cities using Google Maps API. To see thier Json Format go here: https://developers.google.com/maps/documentation/directions/start

So My Class objects look like this to match

public class GeocodedWaypoint
{
    public string geocoder_status { get; set; }
    public string place_id { get; set; }
    public List<string> types { get; set; }
    public bool? partial_match { get; set; }
}

public class Northeast
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class Southwest
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class Bounds
{
    public Northeast northeast { get; set; }
    public Southwest southwest { get; set; }
}

public class Distance
{
    public string text { get; set; }
    public int value { get; set; }
}

public class Duration
{
    public string text { get; set; }
    public int value { get; set; }
}

public class EndLocation
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class StartLocation
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class Distance2
{
    public string text { get; set; }
    public int value { get; set; }
}

public class Duration2
{
    public string text { get; set; }
    public int value { get; set; }
}

public class EndLocation2
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class Polyline
{
    public string points { get; set; }
}

public class StartLocation2
{
    public double lat { get; set; }
    public double lng { get; set; }
}

public class Step
{
    public Distance2 distance { get; set; }
    public Duration2 duration { get; set; }
    public EndLocation2 end_location { get; set; }
    public string html_instructions { get; set; }
    public Polyline polyline { get; set; }
    public StartLocation2 start_location { get; set; }
    public string travel_mode { get; set; }
    public string maneuver { get; set; }
}

public class Leg
{
    public Distance distance { get; set; }
    public Duration duration { get; set; }
    public string end_address { get; set; }
    public EndLocation end_location { get; set; }
    public string start_address { get; set; }
    public StartLocation start_location { get; set; }
    public List<Step> steps { get; set; }
    public List<object> traffic_speed_entry { get; set; }
    public List<object> via_waypoint { get; set; }
}

public class OverviewPolyline
{
    public string points { get; set; }
}

public class Route
{
    public Bounds bounds { get; set; }
    public string copyrights { get; set; }
    public List<Leg> legs { get; set; }
    public OverviewPolyline overview_polyline { get; set; }
    public string summary { get; set; }
    public List<object> warnings { get; set; }
    public List<object> waypoint_order { get; set; }
}

public class RootObject
{
    public List<GeocodedWaypoint> geocoded_waypoints { get; set; }
    public List<Route> routes { get; set; }
    public string status { get; set; }
}

and I am wanting to get the leg object with this

 static async Task<Leg> GetLegAsync(string path)
    {
        Leg leg = null;
        HttpResponseMessage response = await client.GetAsync(path);
        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            leg = JsonConvert.DeserializeObject<Leg>(json);

        }

        return leg;
    }

The problem is that when I am accessing the leg object through this it isn't deserialzing properly. Sorry if it's stupid simple but I haven't really messed with HTTP clients and stuff like this. I'm pretty good with C# but I haven't really studied much past just functionality and went into some of this.

EDIT: If this is helpful

 static async Task RunAsync(string pos1,string pos2)
    {
        string apiKey = "MUST_KEEP_HIDDEN!";

        client.BaseAddress = new Uri("https://maps.googleapis.com/maps/api/directions/json?origin="+pos1+"&destination="+pos2+"&key=" + apiKey);

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        //Console.ReadLine();
        Leg leg = await GetLegAsync("https://maps.googleapis.com/maps/api/directions/json?origin=" + pos1 + "&destination=" + pos2 + "4&key=" + apiKey);

        showinfo(leg);

    }

thanks in advance

6
  • What is inside your json object? Commented Oct 27, 2017 at 4:22
  • 2
    Aside from not showing us your json object, you have a class called RootObject which I'm betting is the main object you should deserialize to. I bet you even used json2csharp.com to make this. Commented Oct 27, 2017 at 4:26
  • Well the response being returned is not a Leg so JsonConvert.DeserializeObject<Leg>(json) is not going to work. It looks like your RootObject matches the response. Also, the JSON being returned is snake case, I'm not positive but I am pretty sure that neither Newtonsoft.JSON nor Microsoft's JSON deserializer (can't remember the class offhand) will map snake case to Pascal case by default. Commented Oct 27, 2017 at 4:29
  • What do you are you calling for on json object? like the json response? I put up a link that should take you to it also, whats wrong with json2csharp Ive used it before and I will add some more code up there if this is helpful Commented Oct 27, 2017 at 5:08
  • @oceanichelicopter you should deserialize to RootObject. The problem with using json2csharp is that sometimes it creates the wrong datatype for primitives. To some applications, the difference between decimal and double can cause you major problems. Sometimes you need to override the name of the property as json2csharp can't translate it into a class property. You can use [JsonProperty(PropertyName = "FooBar")] to fix this if it ever happens. Commented Oct 27, 2017 at 5:13

1 Answer 1

1

Generated this code using quicktype.io.

jsonString is the API response from Google Maps API.

For this example I used the following API:

https://maps.googleapis.com/maps/api/directions/json?origin=Disneyland&destination=Universal+Studios+Hollywood4&key=AIzaSyAgQqqNyauyRWXdXC1HajFHyLD1vp70FdM

// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using QuickType;
//
//    var data = GettingStarted.FromJson(jsonString);
//
namespace QuickType
{
    using System;
    using System.Net;
    using System.Collections.Generic;

    using Newtonsoft.Json;

    public partial class GettingStarted
    {
        [JsonProperty("routes")]
        public Route[] Routes { get; set; }

        [JsonProperty("geocoded_waypoints")]
        public GeocodedWaypoint[] GeocodedWaypoints { get; set; }

        [JsonProperty("status")]
        public string Status { get; set; }
    }

    public partial class Route
    {
        [JsonProperty("overview_polyline")]
        public Polyline OverviewPolyline { get; set; }

        [JsonProperty("copyrights")]
        public string Copyrights { get; set; }

        [JsonProperty("bounds")]
        public Bounds Bounds { get; set; }

        [JsonProperty("legs")]
        public Leg[] Legs { get; set; }

        [JsonProperty("warnings")]
        public object[] Warnings { get; set; }

        [JsonProperty("summary")]
        public string Summary { get; set; }

        [JsonProperty("waypoint_order")]
        public object[] WaypointOrder { get; set; }
    }

    public partial class Polyline
    {
        [JsonProperty("points")]
        public string Points { get; set; }
    }

    public partial class Bounds
    {
        [JsonProperty("northeast")]
        public EndLocation Northeast { get; set; }

        [JsonProperty("southwest")]
        public EndLocation Southwest { get; set; }
    }

    public partial class EndLocation
    {
        [JsonProperty("lat")]
        public double Lat { get; set; }

        [JsonProperty("lng")]
        public double Lng { get; set; }
    }

    public partial class Leg
    {
        [JsonProperty("end_location")]
        public EndLocation EndLocation { get; set; }

        [JsonProperty("duration")]
        public Distance Duration { get; set; }

        [JsonProperty("distance")]
        public Distance Distance { get; set; }

        [JsonProperty("end_address")]
        public string EndAddress { get; set; }

        [JsonProperty("start_location")]
        public EndLocation StartLocation { get; set; }

        [JsonProperty("traffic_speed_entry")]
        public object[] TrafficSpeedEntry { get; set; }

        [JsonProperty("start_address")]
        public string StartAddress { get; set; }

        [JsonProperty("steps")]
        public Step[] Steps { get; set; }

        [JsonProperty("via_waypoint")]
        public object[] ViaWaypoint { get; set; }
    }

    public partial class Distance
    {
        [JsonProperty("text")]
        public string Text { get; set; }

        [JsonProperty("value")]
        public long Value { get; set; }
    }

    public partial class Step
    {
        [JsonProperty("html_instructions")]
        public string HtmlInstructions { get; set; }

        [JsonProperty("duration")]
        public Distance Duration { get; set; }

        [JsonProperty("distance")]
        public Distance Distance { get; set; }

        [JsonProperty("end_location")]
        public EndLocation EndLocation { get; set; }

        [JsonProperty("polyline")]
        public Polyline Polyline { get; set; }

        [JsonProperty("maneuver")]
        public string Maneuver { get; set; }

        [JsonProperty("start_location")]
        public EndLocation StartLocation { get; set; }

        [JsonProperty("travel_mode")]
        public string TravelMode { get; set; }
    }

    public partial class GeocodedWaypoint
    {
        [JsonProperty("partial_match")]
        public bool? PartialMatch { get; set; }

        [JsonProperty("geocoder_status")]
        public string GeocoderStatus { get; set; }

        [JsonProperty("place_id")]
        public string PlaceId { get; set; }

        [JsonProperty("types")]
        public string[] Types { get; set; }
    }

    public partial class GettingStarted
    {
        public static GettingStarted FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted>(json, Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this GettingStarted self) => JsonConvert.SerializeObject(self, Converter.Settings);
    }

    public class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
        };
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

thanks so much for the help. One more question, when I enter a new ending address and click to get the new json data I get a Invalid Operation Exception
Nevermind I realized what I was doing. Thanks for your help!
@oceanichelicopter don't forget to mark an answer correct if it is. :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.