/// <summary> 读取一个值对象 /// </summary> /// <param name="reader"></param> /// <param name="type"></param> /// <returns></returns> private object ReadValue(UnsafeJsonReader reader, Type type) { if (reader.IsEnd()) { ThrowException("字符串意外结束!"); } var c = reader.Current; switch (c) { case '[': reader.MoveNext(); var array = ReadArray(reader, type); if (reader.Current != ']') { ThrowException("缺少闭合的 ]"); } reader.MoveNext(); return(array); case '{': reader.MoveNext(); var obj = ReadObject(reader, type); if (reader.Current != '}') { ThrowException("缺少闭合的 }"); } reader.MoveNext(); return(obj); case '"': case '\'': { if (type == typeof(DateTime)) { return(reader.ReadDateTime()); } return(ParseString(reader, type)); } default: { object val = reader.ReadConsts(); if (val == null) { return(null); } if (type.IsInstanceOfType(val) == false) { val = Convert.ChangeType(val, type); } return(val); } } }
/// <summary> 将字符串解析为指定类型 /// </summary> /// <param name="str"></param> /// <param name="type"></param> /// <returns></returns> private object ParseString(UnsafeJsonReader reader, Type type) { char quot; string str; var typecode = Type.GetTypeCode(type); if ((typecode >= TypeCode.SByte && typecode <= TypeCode.Decimal) || typecode == TypeCode.Boolean) { if (type.IsSubclassOf(typeof(Enum))) { return(Enum.Parse(type, reader.ReadString())); } quot = reader.Current; if (quot != '\"' && quot != '\'') { ThrowMissingCharException(quot); } if (reader.SkipChar(quot) == false) { ThrowMissingCharException(quot); } var val = Convert.ChangeType(reader.ReadConsts(), type); if (reader.SkipChar(quot) == false) { ThrowMissingCharException(quot); } return(val); } switch (typecode) { case TypeCode.DateTime: return(reader.ReadDateTime()); case TypeCode.Object: str = reader.ReadString(); if (type == typeof(Guid)) { try { if (str.Length > 30) { return(new Guid(str)); } else { return(new Guid(Convert.FromBase64String(str))); } } catch { return(Guid.Empty); } } else if (type == typeof(Object)) { return(str); } throw new Exception(); case TypeCode.Char: return(Char.Parse(reader.ReadString())); case TypeCode.String: return(reader.ReadString()); case TypeCode.DBNull: str = reader.ReadString(); if (str.Length == 0 || str == "null" || str == "undefined" || string.IsNullOrEmpty(str)) { return(DBNull.Value); } throw new Exception(); default: return(Convert.ChangeType(reader.ReadString(), type)); } }