ASP.NET Core 3.1 Web API如何正确接收Body子类参数并完成反序列化
问题根因
你的接口参数声明为基类ThirdPartyBaseToken,默认情况下JSON序列化器只会基于基类的元数据进行反序列化,子类ThirdPartyChildToken重写属性标记的JsonProperty特性不会被识别,因此openToken字段无法完成映射。
可行解决方案
方案1:使用JsonProperty多别名配置(推荐,改动最小)
如果使用Newtonsoft.Json v12及以上版本,直接给基类的AccessToken属性添加别名即可,无需定义子类:
public class ThirdPartyBaseToken { [JsonProperty("accessToken", AlternativeNames = new[] {"openToken"})] public virtual string AccessToken { get; set; } [JsonProperty("brand")] public virtual string Brand { get; set; } }
序列化器会自动匹配accessToken或openToken任意一个字段赋值给AccessToken属性。
方案2:双属性兼容适配(兼容性最强,无序列化器版本要求)
直接在类中定义两个属性分别绑定不同的字段,合并返回有效值,无需修改任何序列化配置:
public class ThirdPartyBaseToken { [JsonProperty("accessToken")] public string InnerAccessToken { get; set; } [JsonProperty("openToken")] public string InnerOpenToken { get; set; } // 对外统一取有效值 public string AccessToken => InnerAccessToken ?? InnerOpenToken; [JsonProperty("brand")] public string Brand { get; set; } }
方案3:自定义多态反序列化(适合需要保留继承结构的场景)
如果一定要保留基类+子类的继承设计,需要自定义JSON转换器,根据请求报文字段决定反序列化的目标类型:
- 定义转换器:
public class ThirdPartyTokenConverter : JsonConverter<ThirdPartyBaseToken> { public override ThirdPartyBaseToken ReadJson(JsonReader reader, Type objectType, ThirdPartyBaseToken existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); // 判断存在的字段,选择反序列化类型 var target = jObject.ContainsKey("openToken") ? new ThirdPartyChildToken() : new ThirdPartyBaseToken(); serializer.Populate(jObject.CreateReader(), target); return target; } public override void WriteJson(JsonWriter writer, ThirdPartyBaseToken value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
- 给基类标记转换器特性:
[JsonConverter(typeof(ThirdPartyTokenConverter))] public class ThirdPartyBaseToken { // 原有属性保持不变 }
内容的提问来源于stack exchange,提问作者Ocean Sun
相关产品推荐
相关产品推荐

