Skip to content

Instantly share code, notes, and snippets.

@einarwh
Last active May 13, 2020 17:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save einarwh/12cef7017cc968c7b34522f626d5b795 to your computer and use it in GitHub Desktop.
Save einarwh/12cef7017cc968c7b34522f626d5b795 to your computer and use it in GitHub Desktop.
A custom deserializer for dictionaries.
public class PropertyBagDeserializer : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return ReadValue(reader, serializer);
}
private static object ReadValue(JsonReader reader, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
return ReadObjectValue(reader, serializer);
}
else if (reader.TokenType == JsonToken.StartArray)
{
return ReadArrayValue(reader, serializer);
}
else
{
return ReadSimpleValue(reader, serializer);
}
}
private static object ReadObjectValue(JsonReader reader, JsonSerializer serializer)
{
reader.Read();
var dictionary = new Dictionary<string, object>();
while (reader.TokenType != JsonToken.EndObject)
{
if (reader.TokenType == JsonToken.PropertyName)
{
var propertyName = (string) reader.Value;
reader.Read();
dictionary[propertyName] = ReadValue(reader, serializer);
}
}
reader.Read();
return dictionary;
}
private static object ReadArrayValue(JsonReader reader, JsonSerializer serializer)
{
reader.Read();
var list = new List<object>();
while (reader.TokenType != JsonToken.EndArray)
{
list.Add(ReadValue(reader, serializer));
}
reader.Read();
return list;
}
private static object ReadSimpleValue(JsonReader reader, JsonSerializer serializer)
{
var val = serializer.Deserialize(reader);
reader.Read();
return val;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment