Google Maps Geocode API JSON结果VB.NET反序列化报错问题
反序列化错误原因排查及修复
核心原因:反序列化目标类型不匹配
Google地理编码API返回的JSON根结构是包含results数组和status字段的对象,而非直接的Result数组。你当前直接将JSON字符串反序列化为Result()类型,与实际JSON结构不匹配,这是报错的主要原因。
API返回的JSON简化结构如下:
{ "results": [ { /* Result对象详情 */ } ], "status": "OK" }
你已经定义了匹配该根结构的Root类,但代码中未使用,反而错误地直接反序列化为Result数组,导致结构不匹配报错。
关于转义字符与换行符的说明
你提到的换行符(vbLf)和转义字符属于JSON的格式化输出,Newtonsoft.Json默认可以正常解析这类格式化后的JSON字符串,无需额外处理,这不是报错的根源。
修复步骤
- 修正反序列化代码:将目标类型改为
Root类,而非Result()数组:
Dim client As WebClient = New WebClient() client.Encoding = Encoding.UTF8 ' 确保编码正确,避免乱码引发的隐性错误 Dim uri As Uri = GetGeocodeUri(address) Dim geocodeInfo As String = client.DownloadString(uri) Dim root As Root = JsonConvert.DeserializeObject(Of Root)(geocodeInfo) ' 从Root对象中获取Result列表 Dim test As List(Of Result) = root.results
- 验证JSON有效性(可选):如果仍有问题,可先将JSON解析为
JObject确认结构是否符合预期:
Dim jsonObj As Newtonsoft.Json.Linq.JObject = Newtonsoft.Json.Linq.JObject.Parse(geocodeInfo) ' 输出状态和结果数量,验证数据获取是否正常 Console.WriteLine($"Status: {jsonObj("status")}, Results Count: {jsonObj("results").Count()}")
- 处理API异常状态:建议加入对
root.status的判断,仅当status为"OK"时再处理结果,避免API返回错误(如"ZERO_RESULTS"、"INVALID_REQUEST")导致后续逻辑出错。
内容的提问来源于stack exchange,提问作者user3626339
相关产品推荐
相关产品推荐

