Beispiel #1
0
        /// <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();
                return(ChangeType(val, type));
            }
            }
        }
Beispiel #2
0
 /// <summary> 将字符串解析为指定类型
 /// </summary>
 /// <param name="reader"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 private static object ParseString(UnsafeJsonReader reader, Type type) {
     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());
         }
         char quot = reader.Current;
         reader.MoveNext();
         var val = 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)) {
                 if (str.Length > 30)//这个是从fastJson学来的 =^_^=
                 {
                     return new Guid(str);
                 }
                 return new Guid(Convert.FromBase64String(str));
             }
             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 ChangeType(reader.ReadString(), type);
     }
 }
Beispiel #3
0
 /// <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();
                 return ChangeType(val, type);
             }
     }
 }
Beispiel #4
0
        /// <summary> 将字符串解析为指定类型
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private static object ParseString(UnsafeJsonReader reader, Type type)
        {
            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()));
                }
                char quot = reader.Current;
                reader.MoveNext();
                var val = 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))
                {
                    if (str.Length > 30)    //这个是从fastJson学来的 =^_^=
                    {
                        return(new Guid(str));
                    }
                    return(new Guid(Convert.FromBase64String(str)));
                }
                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(ChangeType(reader.ReadString(), type));
            }
        }