using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
Content = new Dictionary<Locale, string>
{ Locale.English, "hello" },
{ Locale.Spanish, "hola" },
{ Locale.French, "bonjour" },
{ Locale.German, "hallo" }
var settings = new JsonSerializerSettings();
settings.Converters.Add(new LocaleDictionaryConverter());
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(doc, settings);
var doc2 = JsonConvert.DeserializeObject<Document>(json, settings);
foreach (var kvp in doc2.Content)
Console.WriteLine(kvp.Key.Name + ": " + kvp.Value);
public IDictionary<Locale, string> Content { get; set; }
public int Id { get; private set; }
public string Abbreviation { get; private set; }
public string Name { get; private set; }
private Locale(int id, string abbr, string name)
public static Locale FromAbbreviation(string abbreviation)
var locale = All.FirstOrDefault(l => l.Abbreviation == abbreviation);
public static readonly Locale English = new Locale(1, "en", "English");
public static readonly Locale Spanish = new Locale(2, "es", "Spanish");
public static readonly Locale French = new Locale(3, "fr", "French");
public static readonly Locale German = new Locale(4, "de", "German");
public static readonly Locale[] All = new Locale[] { English, Spanish, French, German };
class LocaleDictionaryConverter : JsonConverter
public override bool CanConvert(Type objectType)
return typeof(IDictionary<Locale, string>).IsAssignableFrom(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
Dictionary<Locale, string> dict = new Dictionary<Locale, string>();
foreach (var prop in obj.Properties())
dict.Add(Locale.FromAbbreviation(prop.Name), (string)prop.Value);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
IDictionary<Locale, string> dict = (IDictionary<Locale, string>)value;
JObject obj = new JObject();
foreach (var kvp in dict)
obj.Add(kvp.Key.Abbreviation, kvp.Value);