Ejemplo n.º 1
0
        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);
        }