You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:13