public static object ParseQuotedPrimitive(string value) { if (string.IsNullOrEmpty(value)) { return(null); } Guid guidValue; if (Guid.TryParse(value, out guidValue)) { return(guidValue); } if (value.StartsWith(DateTimeSerializer.EscapedWcfJsonPrefix, StringComparison.Ordinal) || value.StartsWith(DateTimeSerializer.WcfJsonPrefix, StringComparison.Ordinal)) { return(DateTimeSerializer.ParseWcfJsonDate(value)); } if (JsConfig.DateHandler == DateHandler.ISO8601) { // check that we have UTC ISO8601 date: // YYYY-MM-DDThh:mm:ssZ // YYYY-MM-DDThh:mm:ss+02:00 // YYYY-MM-DDThh:mm:ss-02:00 if (value.Length > 14 && value[10] == 'T' && (value.EndsWithInvariant("Z") || value[value.Length - 6] == '+' || value[value.Length - 6] == '-')) { return(DateTimeSerializer.ParseShortestXsdDateTime(value)); } } if (JsConfig.DateHandler == DateHandler.RFC1123) { // check that we have RFC1123 date: // ddd, dd MMM yyyy HH:mm:ss GMT if (value.Length == 29 && (value.EndsWithInvariant("GMT"))) { return(DateTimeSerializer.ParseRFC1123DateTime(value)); } } return(Serializer.UnescapeString(value)); }
public static DateTime FromShortestXsdDateTimeString(this string xsdDateTime) { return(DateTimeSerializer.ParseShortestXsdDateTime(xsdDateTime)); }
private static ParseStringDelegate GetParseFn() { var nullableType = Nullable.GetUnderlyingType(typeof(T)); if (nullableType == null) { var typeCode = typeof(T).GetTypeCode(); switch (typeCode) { case TypeCode.Boolean: //Lots of kids like to use '1', HTML checkboxes use 'on' as a soft convention return(value => value.Length == 1 ? value == "1" : value.Length == 2 ? value == "on" : bool.Parse(value)); case TypeCode.Byte: return(value => byte.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.SByte: return(value => sbyte.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int16: return(value => short.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt16: return(value => ushort.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int32: return(value => int.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt32: return(value => uint.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int64: return(value => long.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt64: return(value => ulong.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Single: return(value => float.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Double: return(value => double.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Decimal: return(value => decimal.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.DateTime: return(value => DateTimeSerializer.ParseShortestXsdDateTime(value)); case TypeCode.Char: char cValue; return(value => char.TryParse(value, out cValue) ? cValue : '\0'); } if (typeof(T) == typeof(Guid)) { return(value => new Guid(value)); } if (typeof(T) == typeof(DateTimeOffset)) { return(value => DateTimeSerializer.ParseDateTimeOffset(value)); } if (typeof(T) == typeof(TimeSpan)) { return(value => DateTimeSerializer.ParseTimeSpan(value)); } #if !(__IOS__ || SL5 || XBOX || ANDROID || PCL) if (typeof(T) == typeof(System.Data.Linq.Binary)) { return(value => new System.Data.Linq.Binary(Convert.FromBase64String(value))); } #endif } else { var typeCode = nullableType.GetTypeCode(); switch (typeCode) { case TypeCode.Boolean: return(value => string.IsNullOrEmpty(value) ? (bool?)null : value.Length == 1 ? value == "1" : value.Length == 2 ? value == "on" : bool.Parse(value)); case TypeCode.Byte: return(value => string.IsNullOrEmpty(value) ? (byte?)null : byte.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.SByte: return(value => string.IsNullOrEmpty(value) ? (sbyte?)null : sbyte.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int16: return(value => string.IsNullOrEmpty(value) ? (short?)null : short.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt16: return(value => string.IsNullOrEmpty(value) ? (ushort?)null : ushort.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int32: return(value => string.IsNullOrEmpty(value) ? (int?)null : int.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt32: return(value => string.IsNullOrEmpty(value) ? (uint?)null : uint.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Int64: return(value => string.IsNullOrEmpty(value) ? (long?)null : long.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.UInt64: return(value => string.IsNullOrEmpty(value) ? (ulong?)null : ulong.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Single: return(value => string.IsNullOrEmpty(value) ? (float?)null : float.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Double: return(value => string.IsNullOrEmpty(value) ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.Decimal: return(value => string.IsNullOrEmpty(value) ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture)); case TypeCode.DateTime: return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value)); case TypeCode.Char: char cValue; return(value => string.IsNullOrEmpty(value) ? (char?)null : char.TryParse(value, out cValue) ? cValue : '\0'); } if (typeof(T) == typeof(TimeSpan?)) { return(value => DateTimeSerializer.ParseNullableTimeSpan(value)); } if (typeof(T) == typeof(Guid?)) { return(value => string.IsNullOrEmpty(value) ? (Guid?)null : new Guid(value)); } if (typeof(T) == typeof(DateTimeOffset?)) { return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value)); } } return(null); }