A generic JsonConverter for Dictionaries and JSON.NET

Update: In the 7.x release of Json.NET, a DictionaryKeyResolver was added that might be able to fix this problem too. I haven't used it yet, so I can't really say, but you might want to check it out.

JSON.NET is a great tool and it already handles Dictionaries well, unless your keys are classes (as opposed to structs). Say you have the following class you want to serialize:

public class DataPoints 
{ public IDictionary<DataPointKey, int> Values { get; set; } }
And the DataPointKey class:
public class DataPointKey 
{ public int Length { get; set; } public int Height { get; set; } }
I'm just making stuff up here, don't mind the actual contents of the class. The important thing is that the key of our Dictionary is a class.

When you let JSON.NET serialize this, you will get the following:

{"Values":{"JsonDictionary.DataPointKey":200}}
Notice how the key is just the class name. This will not deserialize nicely.

In the past, I would create a custom JsonConverter, but this meant repeating code over and over when new keys were introduced. Inheriting from a base converter was my first solution, but I've finally found a converter that can handle any Type.

The result is a little more verbose, but serializes and deserializes nicely:

{"Values":[{"Key":{"Length":10,"Height":20},"Value":200}]}}
The entire code is a little too long to post here, but I've made a Gist you can check out.