使用Newtonsoft.JsonSerializer时,如何忽略无JsonProperty属性的字段?
如何让Newtonsoft.Json序列化时忽略未标记[JsonProperty]的字段?
当然有办法!最常用也最直接的方案是利用Newtonsoft.Json的**[JsonObject(MemberSerialization.OptIn)]特性**——它的核心作用就是告诉序列化器:只处理那些显式标记了[JsonProperty]的成员,其余未标记的字段/属性一律跳过序列化。
具体用法示例
首先给你的实体类加上[JsonObject(MemberSerialization.OptIn)]特性,然后给需要序列化的成员标记[JsonProperty]:
[JsonObject(MemberSerialization.OptIn)] public class UserProfile { // 这个成员会被序列化 [JsonProperty] public string DisplayName { get; set; } // 可以通过JsonProperty指定序列化后的键名,同时该成员会被序列化 [JsonProperty("user_email")] public string Email { get; set; } // 未标记JsonProperty,序列化时会被忽略 public string InternalId { get; set; } // 同样会被忽略 public DateTime LastLoginTime { get; set; } }
接下来执行序列化操作:
var profile = new UserProfile { DisplayName = "Jane Smith", Email = "jane@example.com", InternalId = "abc123", LastLoginTime = DateTime.UtcNow }; string serializedJson = JsonConvert.SerializeObject(profile); // 最终输出的JSON只会包含 "DisplayName" 和 "user_email" 两个字段
全局配置方案(无需给每个类加特性)
如果你的项目里有很多类都需要这个规则,不想逐个加特性,可以通过全局配置JsonSerializerSettings来实现:
var globalSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { // 设置默认的成员搜索范围(公共实例成员) DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.Instance, // 全局启用OptIn模式 MemberSerialization = MemberSerialization.OptIn } }; // 使用这个全局配置序列化任意类 string json = JsonConvert.SerializeObject(profile, globalSettings);
这样所有未标记[JsonProperty]的成员都会被自动忽略,不用再给每个类单独加特性啦。
内容的提问来源于stack exchange,提问作者horatius
相关产品推荐
相关产品推荐

