繁体   English   中英

如何从C#ASP.NET中的JSON字符串中仅解析纬度和经度信息?

[英]How can I parse just the latitude and longitude information from a JSON string in C# ASP.NET?

我到处都是,找不到解决此问题的解决方案。

我正在使用Google Maps API,需要输入一个地址,将其转换为纬度/经度,然后使用这些值生成我的地图。

我正在使用NewtonSoft.Json尝试对字符串进行反序列化,但是我尝试的每种方法都会遇到不同的错误。

这是我访问JSON的方式:

var webClient = new WebClient();
var json = webClient.DownloadString(@"https://maps.googleapis.com/maps/api/geocode/json?address=1600%20Pennsylvania%20Ave%20NW,%20Washington,%20DC%2020500&key=AIzaSyAKORLziVDRpaIlRs7NrPwGsye9NNn6Mdw");

现在,我仅将静态地址用于调试目的,但是稍后将切换至变量。

这是查看JSON的URL:

我知道这是正确导入的,因为我正在使用System.Diagnostics.Debug.WriteLine("json "+json); 检查和调试。

我还通过https://jsonlint.com/确认了它是有效的JSON。

所以现在,我需要反序列化此String才能抓取

  "location" : { "lat" : 38.8976633, "lng" : -77.03657389999999 

并将它们保存到变量中以供以后访问。

我想不参加整个课程就这样做,但是如果那是我可以做的,那就可以管理。

谁能帮我格式化JsonConvert.DeserializeObject()命令来解决这个问题?

您可以使用JSON.net来反序列化部分JSON片段, 是您要实现的示例,这是您的案例的代码。

 var webClient = new WebClient();
 string json = webClient.DownloadString(@"https://maps.googleapis.com/maps/api/geocode/json?address=1600%20Pennsylvania%20Ave%20NW,%20Washington,%20DC%2020500&key=AIzaSyAKORLziVDRpaIlRs7NrPwGsye9NNn6Mdw");
 JObject jsonOb = JObject.Parse(json);
 double lat  = jsonOb["results"]["geometry"]["location"]["lat"];
 double lng  = jsonOb["results"]["geometry"]["location"]["lng"];

首先,您需要为json定义c#类。 这不是手动工作。 将所有json复制到剪贴板。 然后转到Visual Studio,打开创建带有类的新.cs文件,然后打开Edit->Paster special->Paste JSON as Classes 您的情况将是这些课程

public class Rootobject
{
    public Result[] results { get; set; }
    public string status { get; set; }
}

public class Result
{
    public Address_Components[] address_components { get; set; }
    public string formatted_address { get; set; }
    public Geometry geometry { get; set; }
    public string place_id { get; set; }
    public string[] types { get; set; }
}

public class Geometry
{
    public Bounds bounds { get; set; }
    public Location location { get; set; }
    public string location_type { get; set; }
    public Viewport viewport { get; set; }
}

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

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

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

public class Location
{
    public float lat { get; set; }
    public float lng { get; set; }
}

public class Viewport
{
    public Northeast1 northeast { get; set; }
    public Southwest1 southwest { get; set; }
}

public class Northeast1
{
    public float lat { get; set; }
    public float lng { get; set; }
}

public class Southwest1
{
    public float lat { get; set; }
    public float lng { get; set; }
}

public class Address_Components
{
    public string long_name { get; set; }
    public string short_name { get; set; }
    public string[] types { get; set; }
}

然后您可以基于此类对它进行反序列化

 var webClient = new WebClient();
 var json = webClient.DownloadString(@"https://maps.googleapis.com/maps/api/geocode/json?address=1600%20Pennsylvania%20Ave%20NW,%20Washington,%20DC%2020500&key=AIzaSyAKORLziVDRpaIlRs7NrPwGsye9NNn6Mdw");
 var parsedObj = JsonConvert.DeserializeObject<Rootobject>(json);
 var location = parsedObj.results?[0].geometry?.location;
 Console.WriteLine(location.lat);
 Console.WriteLine(location.lng);

最好使一个对象将JSON转换为。 但是您可以使用无类型的对象。

var outputObject = JsonConvert.DeserializeObject(JsonString)

为转换对象转换为对象时,请执行以下操作:

Type outputObject = JsonConvert.DeserializeObject<Type>(jsonstring);

这对我有用

var webClient = new WebClient();
var json = webClient.DownloadString(@"https://maps.googleapis.com/maps/api/geocode/json?address=1600%20Pennsylvania%20Ave%20NW,%20Washington,%20DC%2020500&key=AIzaSyAKORLziVDRpaIlRs7NrPwGsye9NNn6Mdw");
var obj = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(obj.results[0].geometry.bounds.northeast.lat.Value);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM