WPF应用Google地理编码JSON反序列化失败问题求助
解决方案:System.Text.Json反序列化谷歌地理编码JSON失败
问题分析
错误提示指向$.results[0].address_components[0]无法转换为List<AddressComponent>,但你提供的JSON和类定义结构看起来匹配。核心问题是混用了Newtonsoft.Json和System.Text.Json两个序列化库:类注释里写的是Newtonsoft的JsonConvert,但实际代码触发的是System.Text.Json的异常,两个库的默认行为差异导致了转换失败。
具体解决步骤
1. 统一使用System.Text.Json并配置序列化选项
如果继续用System.Text.Json,添加属性大小写不敏感配置(避免键名大小写匹配问题),同时处理可能的空值:
// 定义序列化选项 var serializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 忽略属性名大小写 AllowTrailingCommas = true, // 允许JSON末尾有逗号 DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // 序列化时忽略空值 }; // 反序列化代码 using (var response = (HttpWebResponse)s.GetResponse()) using (var streamReader = new StreamReader(response.GetResponseStream())) { string jsonResponse = streamReader.ReadToEnd(); var root = JsonSerializer.Deserialize<Root>(jsonResponse, serializeOptions); }
同时,更新类定义,将可能为null的属性改为可空类型(比如地理编码结果中bounds字段可能不存在):
public class Geometry { public Bounds? bounds { get; set; } // 改为可空类型 public Location location { get; set; } public string location_type { get; set; } public Viewport viewport { get; set; } }
2. 切换回Newtonsoft.Json(兼容性更好)
如果你原本打算使用Newtonsoft.Json,先安装NuGet包Newtonsoft.Json,然后直接使用注释中的代码:
using (var response = (HttpWebResponse)s.GetResponse()) using (var streamReader = new StreamReader(response.GetResponseStream())) { string jsonResponse = streamReader.ReadToEnd(); var root = JsonConvert.DeserializeObject<Root>(jsonResponse); }
Newtonsoft.Json默认支持snake_case键与同名C#属性的匹配,无需额外配置即可正常反序列化你提供的JSON结构。
3. 验证JSON响应完整性
在反序列化前,先将响应内容打印到控制台,确认JSON没有被截断或篡改:
string jsonResponse = streamReader.ReadToEnd(); Console.WriteLine(jsonResponse); // 检查输出是否与你提供的JSON一致
误区纠正
你提到“反序列化器似乎只期望单个result”,但错误路径指向address_components而非results——你的Root类中results定义为List<Result>,和JSON中的数组结构完全匹配,这部分没有问题。
内容的提问来源于stack exchange,提问作者Graeme Baillie
相关产品推荐
相关产品推荐

