How to use default serialization in a custom JsonConverter
Asked Answered
N

1

58

I have a complex object graph that I am serializing/deserializing with Json.NET. Some of the objects derive from an abstract class, so in order for the deserialization to work properly, I needed to create a custom JsonConverter. Its only role is to select the appropriate concrete implementation of the abstract class at deserialization-time and allow Json.NET to continue on its way.

My problem comes when I want to serialize. I don't need to do anything custom at all. I want to get exactly the same behavior as I would get using JsonConvert.SerializeObject with no custom JsonConverter.

However, since I'm using the custom JsonConverter class for my deserialization needs, I'm forced to supply a WriteJson implementation. Since WriteJson is abstract, I can't just call base.WriteJson, but I want to do essentially that. So my question is, what do I put in that method to get the plain-Jane, default behavior? In other words:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    // What goes here to get default processing?
}
Nikko answered 13/4, 2015 at 23:14 Comment(1)
Why don't you just turn on TypeNameHandling to Auto in your serializer settings? This will add a "$type" property if an instance type is different than its declaring property type (which will be an interface or base class type). Isn't this exactly what you want?Catafalque
U
78

In your custom JsonConverter, override CanWrite and return false:

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

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    throw new NotImplementedException();
}

Then you can just throw an exception from WriteJson, since it won't get called.

(Similarly, to get default behavior during deserialization, override CanRead and return false.)

Note that the same approach can be used for JsonConverter<T> (introduced in Json.NET 11.0.1) since it is just a subclass of JsonConverter that introduces type-safe versions of ReadJson() and WriteJson().

Utrecht answered 13/4, 2015 at 23:19 Comment(2)
Ohh that CanWrite.... it's a pity it wasn't more clear even in the doc ;). Totally forgot about looking at the base type. Thank'sEmersonemery
It is very stupid. This is contraries to solid principlesMaplemaples

© 2022 - 2024 — McMap. All rights reserved.