将JSON绑定到C# DTO时如何处理未预定义的额外属性
实现方案
完全可以实现,两种主流C# JSON处理库都提供了对应特性,功能和你提到的[XmlAnyElement]一致,专门用来捕获未匹配到类属性的JSON字段。
1. 使用Newtonsoft.Json(Json.NET)实现
- 给
ExtraFields属性加上[JsonExtensionData]特性即可 - 注意:如果额外字段可能存在非字符串类型的值,建议将字典类型定义为
Dictionary<string, object>兼容所有类型 - 代码示例:
using Newtonsoft.Json; using System.Collections.Generic; public class UserDto { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } // 新增特性,自动存储所有未匹配的JSON字段 [JsonExtensionData] public Dictionary<string, object> ExtraFields { get; set; } = new Dictionary<string, object>(); }
- 正常调用反序列化即可自动填充额外字段:
var user = JsonConvert.DeserializeObject<UserDto>(jsonString); // 此时user.ExtraFields["field26461"]的值就是"abc123"
2. 使用System.Text.Json(.NET自带原生库)实现
- 用法基本一致,只是特性的命名空间不同
- 代码示例:
using System.Collections.Generic; using System.Text.Json.Serialization; public class UserDto { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [JsonExtensionData] public Dictionary<string, object> ExtraFields { get; set; } = new Dictionary<string, object>(); }
- 反序列化代码:
var user = System.Text.Json.JsonSerializer.Deserialize<UserDto>(jsonString);
如果确认API返回的额外字段值全为字符串类型,也可以将字典的Value类型直接定义为string,不影响功能正常使用。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

