using System.Collections.Generic;
[JsonConverter(typeof(DictionaryConverter))]
public Dictionary<string, string> a { get; set; }
internal class DictionaryConverter : JsonConverter
public override bool CanWrite { get { return false; } }
public override bool CanConvert(Type objectType)
return objectType == typeof(Dictionary<string, string>);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.StartArray)
if (reader.TokenType == JsonToken.EndArray)
return new Dictionary<string, string>();
throw new JsonSerializationException("Non-empty JSON array does not make a valid Dictionary!");
else if (reader.TokenType == JsonToken.Null)
else if (reader.TokenType == JsonToken.StartObject)
Dictionary<string, string> ret = new Dictionary<string, string>();
while (reader.TokenType != JsonToken.EndObject)
if (reader.TokenType != JsonToken.PropertyName)
throw new JsonSerializationException("Unexpected token!");
string key = (string)reader.Value;
if (reader.TokenType != JsonToken.String)
throw new JsonSerializationException("Unexpected token!");
string value = (string)reader.Value;
throw new JsonSerializationException("Unexpected token!");
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
static void DeserializeAndPrint(JsonSerializer ser, string data)
var foo = ser.Deserialize<FooSerial>(new JsonTextReader(new StringReader(data)));
Console.WriteLine("Dict Contains: {0}", foo.a.Count);
foreach (var kvp in foo.a)
Console.WriteLine("[{0}] = {1}", kvp.Key, kvp.Value);
public static void Main()
string bad = "{\"a\": [] }";
string good = "{\"a\" : {} }";
string hasitems = "{\"a\" : { \"foo\" : \"bar\", \"fuz\" : \"baz\" } }";
var ser = JsonSerializer.Create();
DeserializeAndPrint(ser, bad);
DeserializeAndPrint(ser, good);
DeserializeAndPrint(ser, hasitems);