public static object ObjectStringToType(string strType) { var type = ExtractType(strType); if (type != null) { var parseFn = Serializer.GetParseFn(type); var propertyValue = parseFn(strType); return(propertyValue); } if (JsConfig.ConvertObjectTypesIntoStringDictionary && !string.IsNullOrEmpty(strType)) { if (strType[0] == JsWriter.MapStartChar) { var dynamicMatch = DeserializeDictionary <TSerializer> .ParseDictionary <string, object>(strType, null, Serializer.UnescapeString, Serializer.UnescapeString); if (dynamicMatch != null && dynamicMatch.Count > 0) { return(dynamicMatch); } } if (strType[0] == JsWriter.ListStartChar) { return(DeserializeList <List <object>, TSerializer> .Parse(strType)); } } return(Serializer.UnescapeString(strType)); }
public static object ObjectStringToType(StringSegment strType) { var type = ExtractType(strType); if (type != null) { var parseFn = Serializer.GetParseStringSegmentFn(type); var propertyValue = parseFn(strType); return(propertyValue); } if (JsConfig.ConvertObjectTypesIntoStringDictionary && !strType.IsNullOrEmpty()) { if (strType.GetChar(0) == JsWriter.MapStartChar) { var dynamicMatch = DeserializeDictionary <TSerializer> .ParseDictionary <string, object>(strType, null, v => Serializer.UnescapeString(v).Value, v => Serializer.UnescapeString(v).Value); if (dynamicMatch != null && dynamicMatch.Count > 0) { return(dynamicMatch); } } if (strType.GetChar(0) == JsWriter.ListStartChar) { return(DeserializeList <List <object>, TSerializer> .ParseStringSegment(strType)); } } return((JsConfig.TryToParsePrimitiveTypeValues ? ParsePrimitive(strType.Value) : null) ?? Serializer.UnescapeString(strType).Value); }
public static object ObjectStringToType(ReadOnlySpan <char> strType) { var type = ExtractType(strType); if (type != null) { var parseFn = Serializer.GetParseStringSpanFn(type); var propertyValue = parseFn(strType); return(propertyValue); } var config = JsConfig.GetConfig(); if (config.ConvertObjectTypesIntoStringDictionary && !strType.IsNullOrEmpty()) { var firstChar = strType[0]; var endChar = strType[strType.Length - 1]; if (firstChar == JsWriter.MapStartChar && endChar == JsWriter.MapEndChar) { var dynamicMatch = DeserializeDictionary <TSerializer> .ParseDictionary <string, object>(strType, null, v => Serializer.UnescapeString(v).ToString(), v => Serializer.UnescapeString(v).ToString()); if (dynamicMatch != null && dynamicMatch.Count > 0) { return(dynamicMatch); } } if (firstChar == JsWriter.ListStartChar && endChar == JsWriter.ListEndChar) { return(DeserializeList <List <object>, TSerializer> .ParseStringSpan(strType)); } } var primitiveType = config.TryToParsePrimitiveTypeValues ? ParsePrimitive(strType) : null; if (primitiveType != null) { return(primitiveType); } if (Serializer.ObjectDeserializer != null && typeof(TSerializer) == typeof(Json.JsonTypeSerializer)) { return(!strType.IsNullOrEmpty() ? Serializer.ObjectDeserializer(strType) : strType.Value()); } return(Serializer.UnescapeString(strType).Value()); }
private ParseStringSpanDelegate GetCoreParseStringSpanFn <T>() { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (JsConfig <T> .HasDeserializeFn) { return(value => JsConfig <T> .ParseFn(Serializer, value.Value())); } if (type.IsEnum) { return(x => ParseUtils.TryParseEnum(type, Serializer.UnescapeSafeString(x).Value())); } if (type == typeof(string)) { return(Serializer.UnescapeStringAsObject); } if (type == typeof(object)) { return(DeserializeType <TSerializer> .ObjectStringToType); } var specialParseFn = ParseUtils.GetSpecialParseMethod(type); if (specialParseFn != null) { return(v => specialParseFn(v.Value())); } if (type.IsArray) { return(DeserializeArray <T, TSerializer> .ParseStringSpan); } var builtInMethod = DeserializeBuiltin <T> .ParseStringSpan; if (builtInMethod != null) { return(value => builtInMethod(Serializer.UnescapeSafeString(value))); } if (type.HasGenericType()) { if (type.IsOrHasGenericInterfaceTypeOf(typeof(IList <>))) { return(DeserializeList <T, TSerializer> .ParseStringSpan); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IDictionary <,>))) { return(DeserializeDictionary <TSerializer> .GetParseStringSpanMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(ICollection <>))) { return(DeserializeCollection <TSerializer> .GetParseStringSpanMethod(type)); } if (type.HasAnyTypeDefinitionsOf(typeof(Queue <>)) || type.HasAnyTypeDefinitionsOf(typeof(Stack <>))) { return(DeserializeSpecializedCollections <T, TSerializer> .ParseStringSpan); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(KeyValuePair <,>))) { return(DeserializeKeyValuePair <TSerializer> .GetParseStringSpanMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable <>))) { return(DeserializeEnumerable <T, TSerializer> .ParseStringSpan); } var customFn = DeserializeCustomGenericType <TSerializer> .GetParseStringSpanMethod(type); if (customFn != null) { return(customFn); } } var pclParseFn = PclExport.Instance.GetJsReaderParseStringSpanMethod <TSerializer>(typeof(T)); if (pclParseFn != null) { return(pclParseFn); } var isDictionary = typeof(T) != typeof(IEnumerable) && typeof(T) != typeof(ICollection) && (typeof(T).IsAssignableFrom(typeof(IDictionary)) || typeof(T).HasInterface(typeof(IDictionary))); if (isDictionary) { return(DeserializeDictionary <TSerializer> .GetParseStringSpanMethod(type)); } var isEnumerable = typeof(T).IsAssignableFrom(typeof(IEnumerable)) || typeof(T).HasInterface(typeof(IEnumerable)); if (isEnumerable) { var parseFn = DeserializeSpecializedCollections <T, TSerializer> .ParseStringSpan; if (parseFn != null) { return(parseFn); } } if (type.IsValueType) { //at first try to find more faster `ParseStringSpan` method var staticParseStringSpanMethod = StaticParseMethod <T> .ParseStringSpan; if (staticParseStringSpanMethod != null) { return(value => staticParseStringSpanMethod(Serializer.UnescapeSafeString(value))); } //then try to find `Parse` method var staticParseMethod = StaticParseMethod <T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.UnescapeSafeString(value).ToString())); } } else { var staticParseStringSpanMethod = StaticParseRefTypeMethod <TSerializer, T> .ParseStringSpan; if (staticParseStringSpanMethod != null) { return(value => staticParseStringSpanMethod(Serializer.UnescapeSafeString(value))); } var staticParseMethod = StaticParseRefTypeMethod <TSerializer, T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.UnescapeSafeString(value).ToString())); } } var typeConstructor = DeserializeType <TSerializer> .GetParseStringSpanMethod(TypeConfig <T> .GetState()); if (typeConstructor != null) { return(typeConstructor); } var stringConstructor = DeserializeTypeUtils.GetParseStringSpanMethod(type); if (stringConstructor != null) { return(stringConstructor); } return(DeserializeType <TSerializer> .ParseAbstractType <T>); }
public ParseStringDelegate GetParseFn <T>() { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (type.IsEnum) { return(x => Enum.Parse(type, x, true)); } if (type == typeof(string)) { return(Serializer.ParseString); } if (type == typeof(object)) { return(DeserializeType <TSerializer> .ObjectStringToType); } var specialParseFn = ParseUtils.GetSpecialParseMethod(type); if (specialParseFn != null) { return(specialParseFn); } if (type.IsEnum) { return(x => Enum.Parse(type, x, true)); } if (type.IsArray) { return(DeserializeArray <T, TSerializer> .Parse); } var builtInMethod = DeserializeBuiltin <T> .Parse; if (builtInMethod != null) { return(value => builtInMethod(Serializer.ParseRawString(value))); } if (JsConfig <T> .SerializeFn != null) { return(value => JsConfig <T> .ParseFn(Serializer.ParseRawString(value))); } if (type.IsGenericType()) { if (type.IsOrHasGenericInterfaceTypeOf(typeof(IList <>))) { return(DeserializeList <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IDictionary <,>))) { return(DeserializeDictionary <TSerializer> .GetParseMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(ICollection <>))) { return(DeserializeCollection <TSerializer> .GetParseMethod(type)); } if (type.HasAnyTypeDefinitionsOf(typeof(Queue <>)) || type.HasAnyTypeDefinitionsOf(typeof(Stack <>))) { return(DeserializeSpecializedCollections <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable <>))) { return(DeserializeEnumerable <T, TSerializer> .Parse); } } var isCollection = typeof(T).IsOrHasGenericInterfaceTypeOf(typeof(ICollection)); if (isCollection) { var isDictionary = typeof(T).IsAssignableFrom(typeof(IDictionary)) || typeof(T).HasInterface(typeof(IDictionary)); if (isDictionary) { return(DeserializeDictionary <TSerializer> .GetParseMethod(type)); } return(DeserializeEnumerable <T, TSerializer> .Parse); } var isEnumerable = typeof(T).IsAssignableFrom(typeof(IEnumerable)) || typeof(T).HasInterface(typeof(IEnumerable)); if (isEnumerable) { var parseFn = DeserializeSpecializedCollections <T, TSerializer> .Parse; if (parseFn != null) { return(parseFn); } } if (type.IsValueType) { var staticParseMethod = StaticParseMethod <T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.ParseRawString(value))); } } else { var staticParseMethod = StaticParseRefTypeMethod <TSerializer, T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.ParseRawString(value))); } } var typeConstructor = DeserializeType <TSerializer> .GetParseMethod(TypeConfig <T> .GetState()); if (typeConstructor != null) { return(typeConstructor); } var stringConstructor = DeserializeTypeUtils.GetParseMethod(type); if (stringConstructor != null) { return(stringConstructor); } return(DeserializeType <TSerializer> .ParseAbstractType <T>); }
private ParseStringDelegate GetCoreParseFn <T>() { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (JsConfig <T> .HasDeserializeFn) { return(value => JsConfig <T> .ParseFn(Serializer, value)); } if (type.IsEnum()) { return(x => Enum.Parse(type, Serializer.UnescapeSafeString(x), true)); } if (type == typeof(string)) { return(Serializer.UnescapeString); } if (type == typeof(object)) { return(DeserializeType <TSerializer> .ObjectStringToType); } var specialParseFn = ParseUtils.GetSpecialParseMethod(type); if (specialParseFn != null) { return(specialParseFn); } if (type.IsEnum()) { return(x => Enum.Parse(type, x, true)); } if (type.IsArray) { return(DeserializeArray <T, TSerializer> .Parse); } var builtInMethod = DeserializeBuiltin <T> .Parse; if (builtInMethod != null) { return(value => builtInMethod(Serializer.UnescapeSafeString(value))); } if (type.HasGenericType()) { if (type.IsOrHasGenericInterfaceTypeOf(typeof(IList <>))) { return(DeserializeList <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IDictionary <,>))) { return(DeserializeDictionary <TSerializer> .GetParseMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(ICollection <>))) { return(DeserializeCollection <TSerializer> .GetParseMethod(type)); } if (type.HasAnyTypeDefinitionsOf(typeof(Queue <>)) || type.HasAnyTypeDefinitionsOf(typeof(Stack <>))) { return(DeserializeSpecializedCollections <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(KeyValuePair <,>))) { return(DeserializeKeyValuePair <TSerializer> .GetParseMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable <>))) { return(DeserializeEnumerable <T, TSerializer> .Parse); } } #if !NETFX_CORE #if NET40 if (typeof(T).IsAssignableFrom(typeof(System.Dynamic.IDynamicMetaObjectProvider)) || typeof(T).HasInterface(typeof(System.Dynamic.IDynamicMetaObjectProvider))) { return(DeserializeDynamic <TSerializer> .Parse); } #endif #endif var isDictionary = typeof(T) != typeof(IEnumerable) && typeof(T) != typeof(ICollection) && (typeof(T).AssignableFrom(typeof(IDictionary)) || typeof(T).HasInterface(typeof(IDictionary))); if (isDictionary) { return(DeserializeDictionary <TSerializer> .GetParseMethod(type)); } var isEnumerable = typeof(T).AssignableFrom(typeof(IEnumerable)) || typeof(T).HasInterface(typeof(IEnumerable)); if (isEnumerable) { var parseFn = DeserializeSpecializedCollections <T, TSerializer> .Parse; if (parseFn != null) { return(parseFn); } } if (type.IsValueType()) { var staticParseMethod = StaticParseMethod <T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.UnescapeSafeString(value))); } } else { var staticParseMethod = StaticParseRefTypeMethod <TSerializer, T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.UnescapeSafeString(value))); } } var typeConstructor = DeserializeType <TSerializer> .GetParseMethod(TypeConfig <T> .GetState()); if (typeConstructor != null) { return(typeConstructor); } var stringConstructor = DeserializeTypeUtils.GetParseMethod(type); if (stringConstructor != null) { return(stringConstructor); } return(DeserializeType <TSerializer> .ParseAbstractType <T>); }
public ParseStringDelegate GetParseFn <T>() { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (type.IsEnum) { return(x => Enum.Parse(type, x, false)); } if (type == typeof(string)) { return(Serializer.ParseString); } if (type == typeof(object)) { return(x => x); } var specialParseFn = ParseUtils.GetSpecialParseMethod(type); if (specialParseFn != null) { return(specialParseFn); } if (type.IsEnum) { return(x => Enum.Parse(type, x, false)); } if (type.IsArray) { return(DeserializeArray <T, TSerializer> .Parse); } var builtInMethod = DeserializeBuiltin <T> .Parse; if (builtInMethod != null) { return(value => builtInMethod(Serializer.ParseRawString(value))); } if (type.IsGenericType()) { if (type.IsOrHasGenericInterfaceTypeOf(typeof(IList <>))) { return(DeserializeList <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IDictionary <,>))) { return(DeserializeDictionary <TSerializer> .GetParseMethod(type)); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(ICollection <>))) { return(DeserializeCollection <TSerializer> .GetParseMethod(type)); } if (type.HasAnyTypeDefinitionsOf(typeof(Queue <>)) || type.HasAnyTypeDefinitionsOf(typeof(Stack <>))) { return(DeserializeSpecializedCollections <T, TSerializer> .Parse); } if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable <>))) { return(DeserializeEnumerable <T, TSerializer> .Parse); } } var staticParseMethod = StaticParseMethod <T> .Parse; if (staticParseMethod != null) { return(value => staticParseMethod(Serializer.ParseRawString(value))); } var typeConstructor = DeserializeType <TSerializer> .GetParseMethod(type); if (typeConstructor != null) { return(typeConstructor); } var stringConstructor = DeserializeTypeUtils.GetParseMethod(type); if (stringConstructor != null) { return(stringConstructor); } return(null); }