JsonConvert.DeserializeObject无法解析含引用类型属性的Swagger响应
问题分析与解决方案
你遇到的核心问题是Json.NET(JsonConvert所属库)默认无法访问类的非公共成员,而你的MyResponse类中属性的setter是internal修饰的,导致反序列化时无法为这些属性赋值,最终解析失败。下面是具体的解决办法:
方案一:修改属性setter为public(最简单直接)
如果业务逻辑允许开放setter的访问权限,直接将internal set改为public set即可,这样Json.NET可以正常识别并赋值:
public class MyResponse { public string Message { get; set; } public ChildObject ChildObject { get; set; } }
方案二:保留internal setter,配置Json.NET允许访问非公共成员
如果必须保持setter的internal访问级别,可以通过以下两种方式实现:
方式1:使用[JsonProperty]特性标记属性
在需要反序列化的属性上添加[JsonProperty]特性,告诉Json.NET忽略访问修饰符限制,直接处理该属性:
using Newtonsoft.Json; public class MyResponse { [JsonProperty] public string Message { get; internal set; } [JsonProperty] public ChildObject ChildObject { get; internal set; } }
方式2:全局配置JsonSerializerSettings
如果有多个类需要处理非公共成员,可以全局配置Json序列化设置,让Json.NET允许访问非公共的实例成员:
using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; // 创建配置对象 var serializerSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { // 设置搜索标志,包含公共和非公共的实例成员 DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance } }; // 使用该配置进行反序列化 var myResponse = JsonConvert.DeserializeObject<MyResponse>(swaggerResponseJson, serializerSettings);
补充说明
Swashbuckle生成Swagger文档时,只要属性的getter是public的,就会被包含到文档中(不管setter的修饰符),所以你的Swagger文档本身是没问题的,问题完全出在Json.NET的反序列化规则上。
内容的提问来源于stack exchange,提问作者Emyr
相关产品推荐
相关产品推荐

