using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using Xamarin.Forms.Maps;
public long timestamp { get; set; }
public double lat { get; set; }
public double lng { get; set; }
public MapRoute(long timestamp, double lat, double lng)
this.timestamp = timestamp;
public static class PolylineFactory
public static Polyline FromLatLngJson(string jsonString, float? strokeWidth = default, Color strokeColor = default)
var routes = JsonSerializer.Deserialize<List<MapRoute>>(jsonString, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
var polyline = new Polyline();
if (strokeColor != default)
polyline.StrokeColor = strokeColor;
if (strokeWidth != default)
polyline.StrokeWidth = strokeWidth.Value;
foreach (var route in routes)
polyline.Geopath.Add(new Position(route.lat, route.lng));
public static void Test()
string jsonString = " [ {\"timestamp\": 1514172600000, \"Lat\": 37.33417925, \"Lng\": -122.04153133}, " + "{\"timestamp\": 1514172610000, \"Lat\": 37.33419725, \"Lng\": -122.04151333} ]";
var polyline = PolylineFactory.FromLatLngJson(jsonString, 12, Color.Blue);
Console.WriteLine($"polyline.StrokeWidth={polyline.StrokeWidth}, polyline.StrokeColor={polyline.StrokeColor}");
Console.WriteLine("polyline.Geopath={0}", JsonSerializer.Serialize(polyline.Geopath, new JsonSerializerOptions { WriteIndented = true }));
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.Location.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];