public override KeyValuePair <Type, object> ReadJson(JsonReader reader, Type objectType, KeyValuePair <Type, object> existingValue, bool hasExistingValue, JsonSerializer serializer) { var kvpConv = new KeyValuePairConverter(); var obj = kvpConv.ReadJson(reader, objectType, existingValue, serializer); if (obj is null) { return(default(KeyValuePair <Type, object>)); } var(key, value) = (KeyValuePair <Type, object>)obj; if (value is IConvertible) { return(new KeyValuePair <Type, object>(key, Convert.ChangeType(value, key))); } else if (value is JArray jarr) { var arr = jarr.Select(jv => Convert.ChangeType(jv, key.GetElementType())).ToArray(); return(new KeyValuePair <Type, object>(key, arr)); } return(new KeyValuePair <Type, object>(key, value)); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var result = existingValue as ConcurrentDictionarySafe <TKey, TValue> ?? (objectType == _targetType ? new ConcurrentDictionarySafe <TKey, TValue>() : (ConcurrentDictionarySafe <TKey, TValue>)Activator.CreateInstance(objectType)); var entryType = typeof(KeyValuePair <TKey, TValue>); var converter = new KeyValuePairConverter(); reader.Read(); while (reader.TokenType == JsonToken.StartObject) { var entry = (KeyValuePair <TKey, TValue>)converter.ReadJson(reader, entryType, null, serializer); result.AddOrUpdate(entry.Key, entry.Value, (key, value) => default(TValue)); reader.Read(); } return(result); }