internal static bool HasMatchingConverter(IList<JsonConverter> converters, Type objectType, out JsonConverter matchingConverter) { if (objectType == null) throw new ArgumentNullException("objectType"); if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter converter = converters[i]; if (converter.CanConvert(objectType)) { matchingConverter = converter; return true; } } } matchingConverter = null; return false; }
private bool HasMatchingConverter(Type type, out JsonConverter matchingConverter) { return HasMatchingConverter(_converters, type, out matchingConverter); }
private object CreateObject(JsonReader reader, Type objectType, object existingValue, JsonConverter memberConverter) { _level++; object value; JsonConverter converter; if (memberConverter != null) { return memberConverter.ReadJson(reader, objectType); } else if (objectType != null && HasClassConverter(objectType, out converter)) { return converter.ReadJson(reader, objectType); } else if (objectType != null && HasMatchingConverter(objectType, out converter)) { return converter.ReadJson(reader, objectType); } else if (objectType == typeof(JsonRaw)) { return JsonRaw.Create(reader); } else { switch (reader.TokenType) { // populate a typed object or generic dictionary/array // depending upon whether an objectType was supplied case JsonToken.StartObject: if (objectType == null) { value = CreateJToken(reader); } else if (CollectionUtils.IsDictionaryType(objectType)) { if (existingValue == null) value = CreateAndPopulateDictionary(reader, objectType); else value = PopulateDictionary(CollectionUtils.CreateDictionaryWrapper(existingValue), reader); } else { if (existingValue == null) value = CreateAndPopulateObject(reader, objectType); else value = PopulateObject(existingValue, reader, objectType); } break; case JsonToken.StartArray: if (objectType != null) { if (existingValue == null) value = CreateAndPopulateList(reader, objectType); else value = PopulateList(CollectionUtils.CreateCollectionWrapper(existingValue), ReflectionUtils.GetCollectionItemType(objectType), reader); } else { value = CreateJToken(reader); } break; case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Date: value = EnsureType(reader.Value, objectType); break; case JsonToken.StartConstructor: case JsonToken.EndConstructor: string constructorName = reader.Value.ToString(); value = constructorName; break; case JsonToken.Null: case JsonToken.Undefined: if (objectType == typeof(DBNull)) value = DBNull.Value; else value = null; break; default: throw new JsonSerializationException("Unexpected token while deserializing object: " + reader.TokenType); } } _level--; return value; }
private void SerializeValue(JsonWriter writer, object value, JsonConverter memberConverter) { JsonConverter converter; if (value == null) { writer.WriteNull(); } else if (memberConverter != null) { memberConverter.WriteJson(writer, value); } else if (HasClassConverter(value.GetType(), out converter)) { converter.WriteJson(writer, value); } else if (HasMatchingConverter(value.GetType(), out converter)) { converter.WriteJson(writer, value); } else if (JsonConvert.IsJsonPrimitive(value)) { writer.WriteValue(value); } else if (value is IList) { SerializeList(writer, (IList)value); } else if (value is IDictionary) { SerializeDictionary(writer, (IDictionary)value); } else if (value is ICollection) { SerializeCollection(writer, (ICollection)value); } else if (value is IEnumerable) { SerializeEnumerable(writer, (IEnumerable)value); } else if (value is JsonRaw) { writer.WriteRawValue(((JsonRaw)value).Content); } else { SerializeObject(writer, value); } }
private bool HasClassConverter(Type objectType, out JsonConverter converter) { if (objectType == null) throw new ArgumentNullException("objectType"); converter = JsonTypeReflector.GetConverter(objectType, objectType); return (converter != null); }