Last active
May 13, 2020 17:56
-
-
Save einarwh/12cef7017cc968c7b34522f626d5b795 to your computer and use it in GitHub Desktop.
A custom deserializer for dictionaries.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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