using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
DictionaryProperty = new Dictionary<(EnumType1,EnumType2),string>
[(EnumType1.EnumType1Value1,EnumType2.EnumType2Value1)] = "New",
[(EnumType1.EnumType1Value2,EnumType2.EnumType2Value2)] = "Old"
var json = JsonConvert.SerializeObject(obj);
var obj2 = JsonConvert.DeserializeObject<MyObject>(json);
foreach(var kv in obj2.DictionaryProperty)
Console.WriteLine($"{kv.Key.ToString()}={kv.Value}");
public class CustomDictionaryConverter : JsonConverter<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>>
public override void WriteJson(JsonWriter writer, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> value, JsonSerializer serializer)
writer.WriteStartObject();
writer.WritePropertyName($"({kv.Key.Enum1.ToString()},{kv.Key.Enum2.ToString()})");
writer.WriteValue(kv.Value);
public override Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> ReadJson(
, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> existingValue
, JsonSerializer serializer)
Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> tempdict = new Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>();
JObject jObject = JObject.Load(reader);
foreach(var kv in ((IEnumerable<KeyValuePair<string, JToken>>)jObject))
var keys = kv.Key.Replace("(","").Replace(")","").Split(",");
var key1 = Enum.Parse<EnumType1>(keys[0]);
var key2 = Enum.Parse<EnumType2>(keys[1]);
var value = kv.Value.ToString();
tempdict.Add((key1,key2),value);
[JsonConverter(typeof(CustomDictionaryConverter))]
public Dictionary<(EnumType1,EnumType2),string> DictionaryProperty{get;set;}