How can I "un-JsonIgnore" an attribute in a derived class?

.net, c#, json, json.net, jsonserializer

Solution

You can do this by creating a custom `DefaultContractResolver` and overriding its `CreateProperty` method.

For example, given a `Foo` base and a derived `Bar`:

public class Foo
{
    [JsonIgnore]
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Bar : Foo 
{ }

You can create the following contract resolver:

public class MyTypeContractResolver<T> : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,
                                                   MemberSerialization
                                                       memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);

        property.Ignored = false;
        property.ShouldSerialize = propInstance => property.DeclaringType != typeof (T);
        return property;
    }
}

This will set all properties to `Ignored = false`, and then analyze them by the given predicate:

propInstance => property.DeclaringType != typeof (T);

Which in our case means "you should serialize only if they are not of type `Foo`" (since Foo is the `DeclaryingType`).

And then when you want to deserialize, you pass an instance of the contract resolver to `JsonSerializerSettings`:

var bar = new Bar();
var result = JsonConvert.SerializeObject(bar,
    new JsonSerializerSettings {ContractResolver = new MyTypeContractResolver<Bar>()});

Problem

I am using Newtonsoft's JsonSerializer to serialise some classes. As I wanted to omit one field of my class in the serialisation process, I declared it as follow: ``` [JsonIgnore] public int ParentId { get; set; } ``` This worked, but I am now facing a new problem : In a derived class, I would like this field to appear (and do so only in this specific derived class). I have been looking through the documentation and on the Internet for a way to override this setting in child classes (I guess I need something like `[JsonStopIgnore]`, but I couldn't find anything close). - Is there any way for me to force `JsonSerializer` to pick up again this attribute ? - Is it possible to explicitly mark an attribute as `[JsonIgnore]`, but only in base class ?

Original source