如何序列化多层嵌套的复杂模型对象并通过GET Web API传输
多层嵌套模型序列化为QueryString并用于GET请求的实现方案
适配规则说明
目前主流Web框架默认支持的嵌套/集合类QueryString绑定规则如下,你提供的DTO结构完全可以按照该规则完成序列化,后端接收时直接给对应参数加[FromQuery]特性即可自动完成绑定:
- 集合元素格式:
集合属性名[索引].属性名=值 - 深层嵌套格式:
上层属性名.子属性名=值
可行实现方案
方案1:使用成熟的第三方序列化库
.NET生态下已有多个专门处理QueryString序列化的类库,原生支持多层嵌套对象、泛型集合、深层嵌套结构的序列化,不需要手动开发递归逻辑,直接传入DTOClassroom对象即可生成符合绑定规则的QueryString,空值、布尔值、枚举转换等边界场景都已经做了适配,是优先推荐的方案。
方案2:手动实现序列化逻辑
如果不想引入额外依赖,可以自己实现递归序列化逻辑,核心逻辑如下:
- 递归遍历对象的所有公开属性
- 遇到字符串、数值、布尔等基础类型,直接拼接为
键=值的格式 - 遇到
List、IEnumerable等集合类型,遍历每个元素,为每个元素的键添加[索引]前缀后继续递归处理 - 遇到自定义复杂类型,为子属性的键添加
当前属性名.前缀后继续递归处理
注意事项
- GET请求的URL存在长度限制,不同浏览器、服务器的限制通常在2KB~8KB之间,如果你的嵌套集合数据量较大,建议改为POST请求将数据放在请求体中传输,避免URL超长导致请求失败。
- 如果对接的后端不是ASP.NET Core技术栈,需要提前确认后端的QueryString绑定规则,部分框架会用下划线替代点号、用无索引的重复键来处理集合,需要对应调整序列化的键生成规则。
你提供的DTO结构参考
public class DTOClassroom { public string SpreadsheetTitle { get; set; } public List<DTOClassroomMonthlyTest> MonthlyTests { get; set; } public List<DTOClassroomSpecialty_Subject> Specialty_Subjects { get; set; } } public class DTOClassroomMonthlyTest { public int Term_MonthId { get; set; } public int MonthId { get; set; } public string MonthCalculationType { get; set; } } public class DTOClassroomSpecialty_Subject { public int Specialty_SubjectId { get; set; } public bool IsSelected { get; set; } public IEnumerable<DTOClassroomSpecialty_SubjectChild> ChildColumns { get; set; } } public class DTOClassroomSpecialty_SubjectChild { public int ActivityId { get; set; } public int Sort { get; set; } public string Name { get; set; } public string Scope { get; set; } }
内容的提问来源于stack exchange,提问作者Kamnab Kuoch
相关产品推荐
相关产品推荐

