System.IndexOutOfRangeException:索引超出了数组地理编码 API 的范围
本文关键字:编码 API 范围 数组 IndexOutOfRangeException 索引 System | 更新日期: 2023-09-27 18:31:29
我得到的索引超出了这一行数组异常的范围
string strLat = myCoordenates.Results[0].Geometry.Location.Lat.ToString();
这应该从地理编码请求中提取纬度并将其转换为字符串。
这是我用来进行地理编码的类,我从这里得到它:如何将地理编码的地址信息存储到数据库中
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Web;
public class GoogleMapsDll
{
public class GoogleMaps
{
/// <summary>
///
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public static GeoResponse GetGeoCodedResults(string address)
{
string url = string.Format(
"http://maps.google.com/maps/api/geocode/json?address={0}®ion=dk&sensor=false",
HttpUtility.UrlEncode(address)
);
var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeoResponse));
var res = (GeoResponse)serializer.ReadObject(request.GetResponse().GetResponseStream());
return res;
}
}
[DataContract]
public class GeoResponse
{
[DataMember(Name = "status")]
public string Status { get; set; }
[DataMember(Name = "results")]
public CResult[] Results { get; set; }
[DataContract]
public class CResult
{
[DataMember(Name = "geometry")]
public CGeometry Geometry { get; set; }
[DataContract]
public class CGeometry
{
[DataMember(Name = "location")]
public CLocation Location { get; set; }
[DataContract]
public class CLocation
{
[DataMember(Name = "lat")]
public double Lat { get; set; }
[DataMember(Name = "lng")]
public double Lng { get; set; }
}
}
}
public GeoResponse()
{ }
}
}
我已经多次阅读了整件事(什么是IndexOutOfRangeException/ArgumentOutOfRangeException以及如何解决它?)和其中的一部分,但我仍然不确定如何解决这个问题。我觉得可能是因为我没有从我的 api 请求中获得任何结果,但我不确定如何确定这一点。
很明显,您超出了数组异常的范围,因为您尝试访问myCoordenates.Results[0]
但myCoordenates.Results
没有元素。在访问 myCoordenates.Results[0]
之前,请始终检查 myCoordenates.Results
是否为 null 以及myCoordenates.Results
是否包含任何元素。您还需要检查myCoordenates.Results[0].Geometry
是否为 null 以及myCoordenates.Results[0].Geometry.Location
是否为 null 以避免 NullReferenceException,这里也对此进行了解释:什么是 NullReferenceException,如何修复它?
if (myCoordenates.Results != null && myCoordenates.Results.Length > 0)
{
if (myCoordenates.Results[0].Geometry != null
&& myCoordenates.Results[0].Geometry.Location != null)
{
string strLat = myCoordenates.Results[0].Geometry.Location.Lat.ToString();
}
else
{
// logic when myCoordenates.Results[0].Geometry is null or
// myCoordenates.Results[0].Geometry.Location is null
}
}
else
{
// logic when myCoordenates.Results is null or myCoordenates.Results doesn't
// have any elements
}
一般来说,当myCoordenates.Results
不为空时,如果要访问myCoordenates.Results[n]
,则必须始终检查myCoordenates.Results.Length
是否大于n
。下面是要访问myCoordenates.Results
的第四个元素的示例
if (myCoordenates.Results != null && myCoordenates.Results.Length > 3)
{
if (myCoordenates.Results[3].Geometry != null
&& myCoordenates.Results[3].Geometry.Location != null)
{
string strLat = myCoordenates.Results[3].Geometry.Location.Lat.ToString();
}
else
{
// logic when myCoordenates.Results[3].Geometry is null or
// myCoordenates.Results[3].Geometry.Location is null
}
}
else
{
// logic when myCoordenates.Results is null or myCoordenates.Results has
// less than four elements
}