You need to enable JavaScript to run this app. 将JSON绑定到C# DTO时如何处理未预定义的额外属性
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:24:01