调用Ziptastic API时JSON反序列化DefaultState与DefaultCity为空问题求解
问题原因分析
- 序列化特性与反序列化库不匹配:你定义实体类时使用的
[JsonPropertyName]是System.Text.Json命名空间下的专属特性,仅对.NET自带的System.Text.Json序列化库生效,但你实际反序列化调用的是Newtonsoft.Json(Json.NET)的JsonConvert.DeserializeObject方法,Newtonsoft.Json可识别的映射特性为[JsonProperty]。因为country字段的类属性名和接口返回的JSON键名完全一致,无需特性也能正常映射,而state、city对应的类属性名为DefaultState、DefaultCity,和JSON键名不匹配,也没有被当前反序列化库识别的映射特性,所以反序列化后取值为null。 - 赋值逻辑存在笔误:你当前写的
State=ziptasticResponse.DefaultCity属于属性赋值错误,应该取DefaultState的值赋值给State字段。
解决方案
方案1:统一使用Newtonsoft.Json的映射特性
将实体类的特性替换为Newtonsoft.Json可识别的[JsonProperty]即可:
using Newtonsoft.Json; public class ZiptasticAPIResponse { [JsonProperty("country")] public string country { get; set; } [JsonProperty("state")] public string DefaultState { get; set; } [JsonProperty("city")] public string DefaultCity { get; set; } [JsonProperty("citiesList")] public List<CitiesList> CitiesList { get; set; } }
方案2:统一使用System.Text.Json做反序列化
将反序列化调用替换为.NET自带的System.Text.Json类库方法:
// 引入命名空间 using System.Text.Json; var ziptasticResponse = JsonSerializer.Deserialize<ZiptasticAPIResponse>(content);
额外优化建议
- 增加非空判断逻辑,避免反序列化失败后触发空引用异常:
if(ziptasticResponse != null && !string.IsNullOrEmpty(ziptasticResponse.DefaultState) && !string.IsNullOrEmpty(ziptasticResponse.DefaultCity)) { ziptasticResponse.CitiesList = new List<CitiesList>() { new CitiesList() { State = ziptasticResponse.DefaultState, City = ziptasticResponse.DefaultCity } }; }
- 反序列化前先判断请求响应状态码为成功状态,再读取返回内容做解析,避免无效内容触发报错。
内容的提问来源于stack exchange,提问作者GettingStarted
相关产品推荐
相关产品推荐

