如何将JSON输出反序列化为C#Struct(基于调用Google Maps API的返回)
第一次以新手的身份在这里发帖,如果我没有以正确的方式发帖,我深表歉意 我有一个结构来保存.NETMVC5项目中的地理坐标如何将JSON输出反序列化为C#Struct(基于调用Google Maps API的返回),c#,json,google-maps,C#,Json,Google Maps,第一次以新手的身份在这里发帖,如果我没有以正确的方式发帖,我深表歉意 我有一个结构来保存.NETMVC5项目中的地理坐标 public struct GeoCoordinate { private readonly double latitude; private readonly double longitude; public double Latitude { get { return latitude; } }
public struct GeoCoordinate
{
private readonly double latitude;
private readonly double longitude;
public double Latitude { get { return latitude; } }
public double Longitude { get { return longitude; } }
public GeoCoordinate(double latitude, double longitude)
{
this.latitude = latitude;
this.longitude = longitude;
}
public override string ToString()
{
return string.Format("{0},{1}", Latitude, Longitude);
}
}
我试图在Post-Create方法上调用一个方法,用GoogleMaps API提供的位置坐标填充坐标值,该API提供了一个JSON格式的数据流
public GeoCoordinate GEOCodeAddress(String Address)
{
var address = String.Format("https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false", Address.Replace(" ", "+"));
var result = new System.Net.WebClient().DownloadString(address);
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Deserialize<dynamic>(result);
}
公共地理坐标地理编码地址(字符串地址)
{
变量地址=字符串。格式(“https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false”,Address.Replace(“,”+”);
var result=new System.Net.WebClient().DownloadString(地址);
JavaScriptSerializer jss=新的JavaScriptSerializer();
返回jss.Deserialize(结果);
}
我可以“看到”结果中包含JSON,其中包含(在许多其他属性中)我希望返回的位置坐标,我只是在语法上有问题,无法“解析”这些位置属性并将它们返回到我的create方法
在JSON可视化程序中,坐标位于JSON[0].geometry.location.lat和JSON[0].geometry.location.lng中,我猜(?!)JSON[0].geometry.location包含一个应该与我的结构兼容(ish)的对象。如有必要,我很乐意修改结构以使其兼容
提前感谢您提供的任何帮助/见解 查看该URL返回的JSON,需要反序列化为对象的类如下所示(获取此代码的最简单方法是将JSON复制到剪贴板,然后在Visual Studio中,编辑菜单,粘贴特殊内容,然后选择粘贴为JSON类): 要将数据放入其中一个对象,只需执行以下操作(使用Json.Net):
RootObject googleData=JsonConvert.DeserializeObject(结果);
嗨,经过一些实验,我终于发现我可以用下面的语法来解析它。很可能有一个不太详细的版本,但这是有效的
public GeoCoordinate GEOCodeAddress(String Address)
{
var address = String.Format("https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false", Address.Replace(" ", "+"));
var result = new System.Net.WebClient().DownloadString(address);
JavaScriptSerializer jss = new JavaScriptSerializer();
RootObject googleData = JsonConvert.DeserializeObject<RootObject>(result);
GeoCoordinate coordinates = new GeoCoordinate();
coordinates.Latitude= googleData.results[0].geometry.location.lat;
coordinates.Longitude= googleData.results[0].geometry.location.lng;
return coordinates;
公共地理坐标地理编码地址(字符串地址)
{
变量地址=字符串。格式(“https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false”,Address.Replace(“,”+”);
var result=new System.Net.WebClient().DownloadString(地址);
JavaScriptSerializer jss=新的JavaScriptSerializer();
RootObject googleData=JsonConvert.DeserializeObject(结果);
地理坐标=新的地理坐标();
坐标.Latitude=googleData.results[0].geometry.location.lat;
coordinates.Longitude=googleData.results[0].geometry.location.lng;
返回坐标;
非常感谢David。我需要添加所有这些类,还是只添加我感兴趣的反序列化类?我个人会将它们全部添加,最好现在将所有内容序列化,你永远不知道将来会使用什么。谢谢David-这真的很有帮助。抱歉(我对此很陌生)但是你能给我一些关于如何设置RootObject googleData=JsonConvert.DeserializeObject(result)这一行以检索Json输出中的Location对象的指针吗。
RootObject googleData = JsonConvert.DeserializeObject<RootObject>(result);
public GeoCoordinate GEOCodeAddress(String Address)
{
var address = String.Format("https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false", Address.Replace(" ", "+"));
var result = new System.Net.WebClient().DownloadString(address);
JavaScriptSerializer jss = new JavaScriptSerializer();
RootObject googleData = JsonConvert.DeserializeObject<RootObject>(result);
GeoCoordinate coordinates = new GeoCoordinate();
coordinates.Latitude= googleData.results[0].geometry.location.lat;
coordinates.Longitude= googleData.results[0].geometry.location.lng;
return coordinates;