在C#中如何从JSON对象移除指定属性?
在C#中移除JSON对象的属性
在C#里处理JSON移除属性,主要有两种常用的方案——用Newtonsoft.Json(也就是大家常说的Json.NET)或者微软官方的System.Text.Json。我给你分别演示下具体怎么做,你可以根据自己的项目情况选合适的方式:
使用Newtonsoft.Json移除属性
这是很多.NET项目里常用的第三方JSON库,处理动态JSON或者实体类都很灵活。
1. 动态处理(无需实体类)
如果你的JSON结构不固定,或者不想定义实体类,可以直接解析成JObject来操作:
using Newtonsoft.Json.Linq; // 你的原始JSON字符串 string originalJson = @"{""scbs_currentstatus"": """", ""scbs_primaryissue"": """", ""_umb_id"": ""Test"", ""_umb_creator"": ""Admin"", ""_umb_createdate"": ""0001-01-01 00:00:00"", ""_umb_updatedate"": ""0001-01-01 00:00:00"", ""_umb_doctype"": ""Test"", ""_umb_login"": ""Test"", ""_umb_email"": ""Test"", ""_umb_password"": { ""newPassword"": ""Test"", ""oldPassword"": null, ""reset"": null, ""answer"": null }, ""_umb_membergroup"": { "" User"": false, ""Line User"": true, ""Callback User"": false, ""Su User"": false }, ""umbracoMemberComments"": ""Test""}"; // 解析为JObject JObject jsonObj = JObject.Parse(originalJson); // 移除单个属性,比如移除"_umb_password" jsonObj.Remove("_umb_password"); // 批量移除多个属性 string[] propsToRemove = { "_umb_createdate", "_umb_updatedate" }; foreach (var propName in propsToRemove) { jsonObj.Remove(propName); } // 移除嵌套属性(比如_umb_membergroup里的"Line User") jsonObj["_umb_membergroup"]?.Remove("Line User"); // 转回修改后的JSON字符串 string modifiedJson = jsonObj.ToString();
2. 基于实体类的移除
如果你已经有对应的实体类,可以通过自定义ContractResolver在序列化时动态排除属性:
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; // 定义对应的实体类 public class MemberData { public string scbs_currentstatus { get; set; } public string scbs_primaryissue { get; set; } public string _umb_id { get; set; } public string _umb_creator { get; set; } public string _umb_createdate { get; set; } public string _umb_updatedate { get; set; } public string _umb_doctype { get; set; } public string _umb_login { get; set; } public string _umb_email { get; set; } public PasswordData _umb_password { get; set; } public MemberGroup _umb_membergroup { get; set; } public string umbracoMemberComments { get; set; } } public class PasswordData { public string newPassword { get; set; } public string oldPassword { get; set; } public string reset { get; set; } public string answer { get; set; } } public class MemberGroup { [JsonProperty(" User")] public bool User { get; set; } [JsonProperty("Line User")] public bool LineUser { get; set; } [JsonProperty("Callback User")] public bool CallbackUser { get; set; } [JsonProperty("Su User")] public bool SuUser { get; set; } } // 要排除的属性列表 var excludedProps = new HashSet<string> { "_umb_password", "_umb_createdate" }; // 创建自定义ContractResolver var resolver = new DefaultContractResolver { IgnoreSerializableAttribute = true, IgnoreSerializableInterface = true }; resolver.ResolveContract += (sender, args) => { if (args.Contract is JsonObjectContract contract) { var propsToRemove = contract.Properties.Where(p => excludedProps.Contains(p.PropertyName)).ToList(); foreach (var prop in propsToRemove) { contract.Properties.Remove(prop); } } return args.Contract; }; // 序列化配置 var serializeSettings = new JsonSerializerSettings { ContractResolver = resolver, Formatting = Formatting.Indented }; // 先反序列化到实体 MemberData member = JsonConvert.DeserializeObject<MemberData>(originalJson); // 序列化时自动排除指定属性 string modifiedJson = JsonConvert.SerializeObject(member, serializeSettings);
使用System.Text.Json移除属性
这是.NET Core 3.0及以后版本内置的JSON库,不需要额外安装包,适合新项目使用。
1. 动态处理(无需实体类)
注意JsonDocument是只读的,所以需要重新构建JSON对象来移除属性:
using System.Text.Json; using System.Text; // 原始JSON字符串 string originalJson = @"{""scbs_currentstatus"": """", ""scbs_primaryissue"": """", ""_umb_id"": ""Test"", ""_umb_creator"": ""Admin"", ""_umb_createdate"": ""0001-01-01 00:00:00"", ""_umb_updatedate"": ""0001-01-01 00:00:00"", ""_umb_doctype"": ""Test"", ""_umb_login"": ""Test"", ""_umb_email"": ""Test"", ""_umb_password"": { ""newPassword"": ""Test"", ""oldPassword"": null, ""reset"": null, ""answer"": null }, ""_umb_membergroup"": { "" User"": false, ""Line User"": true, ""Callback User"": false, ""Su User"": false }, ""umbracoMemberComments"": ""Test""}"; // 解析为JsonDocument using JsonDocument doc = JsonDocument.Parse(originalJson); JsonElement root = doc.RootElement; // 构建新的JSON using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true }); writer.WriteStartObject(); foreach (JsonProperty prop in root.EnumerateObject()) { // 跳过要移除的属性 if (prop.Name is "_umb_password" or "_umb_createdate") continue; // 处理嵌套对象,移除内部属性 if (prop.Name == "_umb_membergroup" && prop.Value.ValueKind == JsonValueKind.Object) { writer.WriteStartObject(prop.Name); foreach (JsonProperty nestedProp in prop.Value.EnumerateObject()) { if (nestedProp.Name != "Line User") { nestedProp.WriteTo(writer); } } writer.WriteEndObject(); } else { prop.WriteTo(writer); } } writer.WriteEndObject(); writer.Flush(); // 转回字符串 string modifiedJson = Encoding.UTF8.GetString(stream.ToArray());
2. 基于实体类的移除
可以通过JsonSerializerOptions直接指定要排除的属性:
using System.Text.Json; using System.Text.Json.Serialization; // 实体类定义(使用System.Text.Json的特性) public class MemberData { public string scbs_currentstatus { get; set; } public string scbs_primaryissue { get; set; } public string _umb_id { get; set; } public string _umb_creator { get; set; } public string _umb_createdate { get; set; } public string _umb_updatedate { get; set; } public string _umb_doctype { get; set; } public string _umb_login { get; set; } public string _umb_email { get; set; } public PasswordData _umb_password { get; set; } public MemberGroup _umb_membergroup { get; set; } public string umbracoMemberComments { get; set; } } public class PasswordData { public string newPassword { get; set; } public string oldPassword { get; set; } public string reset { get; set; } public string answer { get; set; } } public class MemberGroup { [JsonPropertyName(" User")] public bool User { get; set; } [JsonPropertyName("Line User")] public bool LineUser { get; set; } [JsonPropertyName("Callback User")] public bool CallbackUser { get; set; } [JsonPropertyName("Su User")] public bool SuUser { get; set; } } // 配置序列化选项,指定要排除的属性 var serializeOptions = new JsonSerializerOptions { IgnoreProperties = new HashSet<string> { "_umb_password", "_umb_createdate" }, WriteIndented = true }; // 反序列化到实体 MemberData member = JsonSerializer.Deserialize<MemberData>(originalJson); // 序列化时排除指定属性 string modifiedJson = JsonSerializer.Serialize(member, serializeOptions);
总结
- 如果你的项目是.NET Framework或者已经依赖Newtonsoft.Json,优先选第一种方案,动态处理更灵活。
- 如果是.NET Core/.NET 5+的新项目,推荐用System.Text.Json,不需要额外安装包,性能也不错。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

