You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:45