C# 如何在使用JSON.Net进行序列化期间有条件地忽略字段和属性?

C# 如何在使用JSON.Net进行序列化期间有条件地忽略字段和属性?,c#,json.net,C#,Json.net,如何在使用JSON.Net进行序列化期间有条件地忽略字段和属性? 我无法从JsonIgnoreAttribute继承,因为它是一个密封的类。我该怎么办?您可以使用JSON.NET的ShouldSerialize-语法。在JSON.NET网站上有一个很好的例子: 如果ShouldSerialize不符合您的需要,您可以使用ContractResolver完全控制序列化:我找到了答案。我从JsonConverter继承并创建一个新的转换器 public class CustomJsonConver

如何在使用JSON.Net进行序列化期间有条件地忽略字段和属性?
我无法从
JsonIgnoreAttribute
继承,因为它是一个
密封的
类。我该怎么办?

您可以使用JSON.NET的ShouldSerialize-语法。在JSON.NET网站上有一个很好的例子:


如果ShouldSerialize不符合您的需要,您可以使用ContractResolver完全控制序列化:

我找到了答案。我从
JsonConverter
继承并创建一个新的转换器

public class CustomJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var list = (IList)value;

        JArray s = new JArray();

        foreach (var item in list)
        {
            JToken token = JToken.FromObject(item);
            JObject obj = new JObject();

            foreach (JProperty prop in token)
            {
                if (prop.Name != "Title") // your logic here
                    obj.Add(prop);
            }

            s.Add(obj);
        }

        s.WriteTo(writer);

    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType != typeof(IList);
    }
}

你检查了吗?@Kurubaran是的,但我想有条件地忽略一个字段。。如果没有成功,断点表明在序列化过程中从未调用过该字段。请注意,ShouldSerialize语法是一种约定,因此对于属性Foo,你将有一个ShouldSerializeFoo()方法,它将返回一个true或false,以确定是否应该序列化Foo。
public class CustomJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var list = (IList)value;

        JArray s = new JArray();

        foreach (var item in list)
        {
            JToken token = JToken.FromObject(item);
            JObject obj = new JObject();

            foreach (JProperty prop in token)
            {
                if (prop.Name != "Title") // your logic here
                    obj.Add(prop);
            }

            s.Add(obj);
        }

        s.WriteTo(writer);

    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType != typeof(IList);
    }
}