Example #1
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override bool Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(false);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(false);
            }

            if (value.Length == 1)
            {
                return(value[0] == '1');
            }

            if (IsNullValue(value))
            {
                return(false);
            }

            if (value.Length != 4)
            {
                return(false);
            }

            return((value[0] == 't' || value[0] == 'T')
                   & (value[1] == 'r' || value[1] == 'R')
                   & (value[2] == 'u' || value[2] == 'U')
                   & (value[3] == 'e' || value[3] == 'e'));
        }
Example #2
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override byte Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(0);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(0);
            }

            try
            {
                if (checkNullValue && this.IsNullValue(value))
                {
                    return(0);
                }

                return(ParseByte(value));
            }
            catch (ArgumentOutOfRangeException)
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0-9]范围内", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch (ArgumentException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
Example #3
0
        /// <summary>
        /// 反序列化对象
        /// </summary>
        /// <typeparam name="T">目标类型</typeparam>
        /// <param name="reader">读取器</param>
        /// <param name="setting">配置</param>
        /// <returns></returns>
        public static T Deserialize <T>(IDeserializerReader reader, JsonDeserializeSetting setting)
        {
            reader.Reset();
            var build = ZzzZzDeserializerBuilder <T> .Register(setting);

            return(build.Invoke(reader, setting, 0));
        }
        internal static Nullable <T> CallNullableObjectInvoke <T>(IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel) where T : struct
        {
            if (reader.Count == 0)
            {
                return(null);
            }

            var node = reader.Read(name);

            if (node == null)
            {
                return(null);
            }

            var nodeValue = node.GetValue();

            if (node != null && StringMethodProvider.Default.IsNullValue(nodeValue))
            {
                return(null);
            }

            if (node != null && node.NodeType == ContentNodeType.Object)
            {
                return(ZzzZzDeserializerBuilder <T> .Register(setting).Invoke(reader.Parse(node), setting, arrayLevel));
            }

            return(ZzzZzDeserializerBuilder <T> .Register(setting).Invoke(reader, setting, arrayLevel));
        }
Example #5
0
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="dictionary"></param>
        /// <param name="name">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="reader">The array.</param>
        /// <param name="arrayLevel"></param>
        public virtual void Load(IDictionary dictionary, IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                if (name != null)
                {
                    return;
                }

                while (true)
                {
                    var item = reader.MoveNext();
                    if (item == null)
                    {
                        break;
                    }

                    dictionary[item.Key] = item.ToString();
                    //if (item.NodeType == ContentNodeType.String)
                    //{
                    //    dictionary[item.Key] = item.ToString();
                    //}
                    //else
                    //{
                    //    dictionary[item.Key] = item.ToString();
                    //    //dictionary[item.Key] = reader.Read(item.StartIndex - 1, item.EndIndex + 1);
                    //}
                }

                return;
            }

            if (node.NodeType == ContentNodeType.String)
            {
                return;
            }

            if (node.NodeType != ContentNodeType.Object)
            {
                throw new ArgumentException(string.Format("字典只能为key-value形式,当前形式为{0}", node.NodeType.ToString()));
            }

            foreach (var item in (IList <JsonContentNode>)node.Node)
            {
                dictionary[item.Key] = item.ToString();
                //if (item.NodeType == ContentNodeType.String)
                //{
                //    dictionary[item.Key] = new string(item.GetValue());
                //}
                //else
                //{
                //    dictionary[item.Key] = item.ToString();
                //    //dictionary[n.Key] = reader.Read(n.StartIndex - 1, n.EndIndex + 1);
                //}
            }
        }
Example #6
0
        /// <summary>
        /// 装载数据到字典中
        /// </summary>
        /// <typeparam name="V"></typeparam>
        /// <param name="dictionary">The result.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="name">The name.</param>
        /// <param name="arrayLevel"></param>
        public virtual void LoadStringKey <V>(IDictionary <string, V> dictionary, IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                if (name != null)
                {
                    return;
                }

                while (true)
                {
                    var item = reader.MoveNext();
                    if (item == null)
                    {
                        break;
                    }

                    var key = ZzzZzDeserializerBuilder <string> .Register(setting).Invoke(ThunderReader.Load(item.Key), setting, arrayLevel);

                    if (string.IsNullOrEmpty(key))
                    {
                        continue;
                    }

                    var value = ZzzZzDeserializerBuilder <V> .Register(setting).Invoke(reader.Parse(item), setting, arrayLevel);

                    dictionary[key] = value;
                }

                return;
            }

            if (node.NodeType == ContentNodeType.String)
            {
                return;
            }

            if (node.NodeType != ContentNodeType.Object)
            {
                throw new ArgumentException(string.Format("字典只能为key-value形式,当前形式为{0}", node.NodeType.ToString()));
            }

            foreach (var n in (IList <JsonContentNode>)node.Node)
            {
                var key = ZzzZzDeserializerBuilder <string> .Register(setting).Invoke(ThunderReader.Load(n.Key), setting, arrayLevel);

                if (string.IsNullOrEmpty(key))
                {
                    continue;
                }

                var value = ZzzZzDeserializerBuilder <V> .Register(setting).Invoke(reader.Parse(n), setting, arrayLevel);

                dictionary[key] = value;
            }
        }
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="node">节点流内容</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(new DateTime());
            }

            if (checkNullValue && this.IsNullValue(value))
            {
                return(new DateTime());
            }

            if (value[value.Length - 1] == 'Z')
            {
                return(ISO8601StyleDateMethodProvider.Default.Parse(reader, setting, node, checkNullValue));
            }

            if (value[value.Length - 1] == 'T')
            {
                return(RFC1123StyleDateMethodProvider.Default.Parse(reader, setting, node, checkNullValue));
            }

            if (value[value.Length - 1] == '/')
            {
                return(MicrosoftStyleDateMethodProvider.Default.Parse(reader, setting, node, checkNullValue));
            }

            if (value.Length > 10)
            {
                if (value[10] == ' ' || value[9] == ' ' || value[8] == ' ')
                {
                    return(ChineseStyleDateMethodProvider.Default.Parse(reader, setting, node, checkNullValue));
                }
            }

            try
            {
                DateTime time;
                DateTime.TryParse(value.ToString(), out time);
                return(time);
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
Example #8
0
        public static DateTime?DateTimeParse(IDeserializerReader reader, JsonDeserializeSetting setting, string name)
        {
            IConvertMethodProvider <DateTime> customMethodProvider = CustomSerializationProvider.QueryCustomDatetimeFormat(setting.DateTimeFormat) as IConvertMethodProvider <DateTime>;

            if (customMethodProvider == null)
            {
                return(DateTimeMethodProvider.Default.Parse(reader, setting, reader.Read(name), true));
            }

            return(customMethodProvider.Parse(reader, setting, reader.Read(name), true));
        }
Example #9
0
        /// <summary>
        /// 反序列化对象
        /// </summary>
        /// <param name="reader">读取器</param>
        /// <param name="targetType">目标类型</param>
        /// <param name="setting">配置</param>
        /// <returns></returns>
        public static object Deserialize(IDeserializerReader reader, Type targetType, JsonDeserializeSetting setting)
        {
            if (targetType == null)
            {
                return(null);
            }

            var @delegate = QueryDeserializeBuilder(targetType, setting);

            reader.Reset();

            return(@delegate(reader, setting, 0));
        }
Example #10
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="node">节点流内容</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override T Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(default(T));
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(default(T));
            }

            return(EnumDeseralizerBuilder <T> .Register(setting).Invoke(value.ToString()));
        }
        internal static T CallObjectInvoke <T>(IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                return(default(T));
            }

            var nodeValue = node.GetValue();

            if (nodeValue != null && StringMethodProvider.Default.IsNullValue(nodeValue))
            {
                return(default(T));
            }

            return(ZzzZzDeserializerBuilder <T> .Register(setting).Invoke(reader.Parse(node), setting, arrayLevel));
        }
Example #12
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字节流内容读取器</param>
        /// <param name="name">名字</param>
        /// <returns>返回目标对象</returns>
        public T Parse(IDeserializerReader reader, JsonDeserializeSetting setting, string name)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                if (reader.Count == 0)
                {
                    return(default(T));
                }

                return(ExceptionDeseralizerBuilder <T> .Register(setting).Invoke(reader, setting, 0));
            }

            if (node.NodeType != ContentNodeType.Object)
            {
                return(default(T));
            }

            return(ExceptionDeseralizerBuilder <T> .Register(setting).Invoke(reader.Parse(node), setting, 0));
        }
Example #13
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override int?Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(null);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(null);
            }

            if (checkNullValue && this.IsNullValue(value))
            {
                return(null);
            }

            return(MethodProviders.Int32MethodProvider.Default.Parse(reader, setting, node, false));
        }
 /// <summary>
 /// 执行builder
 /// </summary>
 internal static T[] CallObjectArrayInvoke <T>(IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
 {
     return(ObjectEnumerableProvider <T> .Default.Parse(reader, setting, name, arrayLevel));
 }
        /// <summary>
        /// 执行builder,反射用到的
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="reader">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="name"></param>
        /// <param name="arrayLevel">层次</param>
        internal static T CallBuilderInvoke <T>(IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var @delegate = ZzzZzDeserializerBuilder <T> .Register(setting);

            return(name == null? @delegate.Invoke(reader, setting, arrayLevel) : @delegate.Invoke(reader.Parse(reader.Read(name)), setting, arrayLevel));
        }
Example #16
0
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="name">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="reader">The array.</param>
        /// <param name="arrayLevel">下一个数组层次,如果为1,则表示数组连续,比如2维数据</param>
        public virtual T[] Parse(IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                if (name != null)
                {
                    return(new T[0]);
                }

                if (reader.ContainerSignal != ContainerSignal.Array)
                {
                    return(new T[0]);
                }

                var temp = new T[reader.Count];
                for (var i = 0; i < reader.Count; i++)
                {
                    var item = reader.MoveNext();
                    if (item == null)
                    {
                        break;
                    }

                    temp[i] = this.MethodProvider.Parse(reader, setting, item, true);
                }

                return(temp);
            }

            if (node.NodeType != ContentNodeType.Array)
            {
                return(new T[0]);
            }

            var nodes = node.Node as IList <JsonContentNode>;

            if (nodes == null)
            {
                return(new T[0]);
            }

            if (nodes.Count == 1)
            {
                var subNodes = nodes[0].Node as IList <JsonContentNode>;
                if (subNodes == null || subNodes.Count <= 0)
                {
                    var nodeValue = nodes[0] == null ? ArraySegmentValue.Empty : nodes[0].GetValue();
                    if (nodeValue == null || nodeValue.Length == 0)
                    {
                        return(new T[0]);
                    }
                }
            }

            if (nodes[0].ArrayLevel != arrayLevel)
            {
                return(new T[0]);
            }

            var list = new T[nodes.Count];

            for (var i = 0; i < nodes.Count; i++)
            {
                var nodeValue = nodes[i] == null ? ArraySegmentValue.Empty : nodes[i].GetValue();
                if (nodes[i].NodeType == ContentNodeType.String)
                {
                    if (StringMethodProvider.Default.IsNullValue(nodeValue))
                    {
                        list[i] = default(T);
                        continue;
                    }
                }

                list[i] = (this.MethodProvider.Parse(reader, setting, nodes[i], true));
            }

            return(list);
        }
Example #17
0
 public InvestModel Parse(IDeserializerReader reader, JsonDeserializeSetting setting, int level)
 {
     return(new InvestModel());
 }
Example #18
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override string Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(null);
            }

            var objnode = node as IObjectContentNode;

            if (objnode == null)
            {
                return(null);
            }

            var objnodeValue = node.GetValue();

            if (objnode.NodeType == ContentNodeType.String)
            {
                if (objnodeValue == null)
                {
                    return(null);
                }

                if (objnodeValue.Length == 0)
                {
                    return(string.Empty);
                }

                if (checkNullValue && this.IsNullValue(objnodeValue))
                {
                    return(null);
                }

                if (!objnode.Escaping)
                {
                    return(objnodeValue.ToString());
                }

                /*有转义符号*/
                var buffer = new char[objnodeValue.Length];
                int index  = 0;
                for (var i = 0; i < objnodeValue.Length; i++)
                {
                    if (i >= objnodeValue.Length)
                    {
                        continue;
                    }

                    switch (objnodeValue[i])
                    {
                    case '\\':
                    {
                        var pre = this.Next(objnodeValue, i);
                        if (!pre.HasValue)
                        {
                            continue;
                        }

                        switch (pre.Value)
                        {
                        case '/':
                        case '\'':
                        case '\"':
                        {
                            i            += 1;
                            buffer[index] = objnodeValue[i];
                            index++;
                        }
                        break;

                        case 'b':
                        {
                            buffer[index] = '\b';
                            index++;
                            i += 1;
                        }
                        break;

                        case 't':
                        {
                            buffer[index] = '\t';
                            index++;
                            i += 1;
                        }
                        break;

                        case 'n':
                        {
                            buffer[index] = '\n';
                            index++;
                            i += 1;
                        }
                        break;

                        case 'f':
                        {
                            buffer[index] = '\f';
                            index++;
                            i += 1;
                        }
                        break;

                        case 'r':
                        {
                            buffer[index] = '\r';
                            index++;
                            i += 1;
                        }
                        break;

                        case '\\':
                        {
                            buffer[index] = '\\';
                            index++;
                            i += 1;
                        }
                        break;

                        case 'u':
                        {
                            var j = i;
                            if (j < 0)
                            {
                                j = 0;
                            }

                            if (objnodeValue.Length >= j + 5)
                            {
                                var @char = (new char[]
                                        {
                                            objnodeValue[j + 0],
                                            objnodeValue[j + 1],
                                            objnodeValue[j + 2],
                                            objnodeValue[j + 3],
                                            objnodeValue[j + 4],
                                            objnodeValue[j + 5],
                                        });

                                var value = 0;
                                var hex   = 0;
                                for (var ae = j + 2; ae < j + 6; ae++)
                                {
                                    /*0-9*/
                                    if (objnodeValue[ae] >= 48 && objnodeValue[ae] <= 57)
                                    {
                                        hex = objnodeValue[ae] - 48;
                                    }
                                    /*A-F*/
                                    else if (objnodeValue[ae] >= 65 && objnodeValue[ae] <= 70)
                                    {
                                        hex = objnodeValue[ae] - 55;
                                    }
                                    /*a-f*/
                                    else if (objnodeValue[ae] >= 97 && objnodeValue[ae] <= 102)
                                    {
                                        hex = objnodeValue[ae] - 87;
                                    }
                                    else
                                    {
                                        throw new ArgumentException(string.Format("在读取{0}处字符失败了:不符合Unicode编码", ae.ToString()));
                                    }

                                    value += hex << (j + 5 - ae) * 4;
                                }
                                buffer[index] = Convert.ToChar(value);
                                i             = j + 5;
                                index++;
                            }
                            else
                            {
                                buffer[index] = objnodeValue[i];
                                index++;
                            }
                        }
                        break;

                        default:
                        {
                            buffer[index] = objnodeValue[i];
                            index++;
                        }
                        break;
                        }
                    }
                    break;

                    default:
                    {
                        buffer[index] = objnodeValue[i];
                        index++;
                    }
                    break;
                    }
                }

                return(new string(buffer, 0, index));
            }

            return(objnode.ToString());
            //return reader.Read(objnode.Segment.Offset, objnode.Segment.Offset + objnode.Segment.Count);
        }
 public static void LoadIntoStringKeyStringvalueDictionary(IDictionary <string, string> target, IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
 {
     IDictionaryProvider.Default.LoadStringKeyStringvalue(target, reader, setting, name, arrayLevel);
 }
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">
        /// </exception>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            try
            {
                double ret = 0d;
                for (var i = 7; i <= 19; i++)
                {
                    switch (value[i])
                    {
                    case '0':
                    {
                    }
                    break;

                    case '1':
                    {
                        ret += GetInteger(20 - i);
                    }
                    break;

                    case '2':
                    {
                        ret += 2 * GetInteger(20 - i);
                    }
                    break;

                    case '3':
                    {
                        ret += 3 * GetInteger(20 - i);
                    }
                    break;

                    case '4':
                    {
                        ret += 4 * GetInteger(20 - i);
                    }
                    break;

                    case '5':
                    {
                        ret += 5 * GetInteger(20 - i);
                    }
                    break;

                    case '6':
                    {
                        ret += 6 * GetInteger(20 - i);
                    }
                    break;

                    case '7':
                    {
                        ret += 7 * GetInteger(20 - i);
                    }
                    break;

                    case '8':
                    {
                        ret += 8 * GetInteger(20 - i);
                    }
                    break;

                    case '9':
                    {
                        ret += 9 * GetInteger(20 - i);
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0,9]范围内", (node.Segment.Offset).ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                    }
                }

                return(_1970.AddMilliseconds(ret));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0-9]范围内", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
 /// <summary>
 /// 写入流中
 /// </summary>
 /// <param name="result"></param>
 /// <param name="name">The writer.</param>
 /// <param name="setting">The setting.</param>
 /// <param name="reader">The array.</param>
 public virtual void Parse(IDictionary <TKey, TValue> result, IDeserializerReader reader, JsonDeserializeSetting setting, string name)
 {
 }
Example #22
0
 /// <summary>
 /// 执行构建序列化,反射用到的
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="reader"></param>
 /// <param name="setting"></param>
 /// <param name="arrayLevel"></param>
 /// <returns></returns>
 private static object DeserializeBuilder <T>(IDeserializerReader reader, JsonDeserializeSetting setting, int arrayLevel)
 {
     return(ZzzZzDeserializerBuilder <T> .Register(setting).Invoke(reader, setting, arrayLevel));
 }
 /// <summary>
 /// 在流中读取字节后转换为对象
 /// </summary>
 /// <param name="setting">配置项</param>
 /// <param name="reader">字符读取器</param>
 /// <param name="node">节点流内容</param>
 /// <param name="checkNullValue">是否检查空值</param>
 /// <returns></returns>
 public abstract T Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue);
Example #24
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">
        /// </exception>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            try
            {
                if (value.IsNullOrEmpty)
                {
                    return(new DateTime());
                }

                /*空格位置*/
                int space = 3;
                /*获取天数*/
                for (var i = 3; i < value.Length; i++)
                {
                    if (value[i] == ' ')
                    {
                        break;
                    }

                    space++;
                }

                int day = GetGigitInZeroToNightChar(value[space + 1]) * 10 + GetGigitInZeroToNightChar(value[space + 2]);
                space += 2;

                /*获取月份*/
                for (var i = space; i < value.Length; i++)
                {
                    if (value[i] == ' ')
                    {
                        break;
                    }

                    space++;
                }

                int month = 0;

                #region month

                switch (value[space + 1])
                {
                case 'j':
                case 'J':
                {
                    switch (value[space + 2])
                    {
                    case 'a':
                    case 'A':
                    {
                        switch (value[space + 3])
                        {
                        case 'n':
                        case 'N':
                        {
                            month = 1;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(nN)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    case 'u':
                    case 'U':
                    {
                        switch (value[space + 3])
                        {
                        case 'n':
                        case 'N':
                        {
                            month = 6;
                        }
                        break;

                        case 'l':
                        case 'L':
                        {
                            month = 7;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(nN或lL)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(aA或uU)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'F':
                case 'f':
                {
                    switch (value[space + 2])
                    {
                    case 'e':
                    case 'E':
                    {
                        switch (value[space + 3])
                        {
                        case 'b':
                        case 'B':
                        {
                            month = 2;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(bB)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(eE)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'M':
                case 'm':
                {
                    switch (value[space + 2])
                    {
                    case 'a':
                    case 'A':
                    {
                        switch (value[space + 3])
                        {
                        case 'r':
                        case 'R':
                        {
                            month = 3;
                        }
                        break;

                        case 'y':
                        case 'Y':
                        {
                            month = 5;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(rR或yY)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(aA)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'A':
                case 'a':
                {
                    switch (value[space + 2])
                    {
                    case 'p':
                    case 'P':
                    {
                        switch (value[space + 3])
                        {
                        case 'r':
                        case 'R':
                        {
                            month = 4;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(rR)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    case 'U':
                    case 'u':
                    {
                        switch (value[space + 3])
                        {
                        case 'g':
                        case 'G':
                        {
                            month = 8;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(gG)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(pPUu)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'S':
                case 's':
                {
                    switch (value[space + 2])
                    {
                    case 'e':
                    case 'E':
                    {
                        switch (value[space + 3])
                        {
                        case 'p':
                        case 'P':
                        {
                            month = 9;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(pP)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(eE)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'O':
                case 'o':
                {
                    switch (value[space + 2])
                    {
                    case 'c':
                    case 'C':
                    {
                        switch (value[space + 3])
                        {
                        case 't':
                        case 'T':
                        {
                            month = 10;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(tT)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(cC)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'N':
                case 'n':
                {
                    switch (value[space + 2])
                    {
                    case 'o':
                    case 'O':
                    {
                        switch (value[space + 3])
                        {
                        case 'v':
                        case 'V':
                        {
                            month = 11;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(vV)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(oO)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;

                case 'D':
                case 'd':
                {
                    switch (value[space + 2])
                    {
                    case 'e':
                    case 'E':
                    {
                        switch (value[space + 3])
                        {
                        case 'c':
                        case 'C':
                        {
                            month = 12;
                        }
                        break;

                        default:
                            throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(cC)范围内", (node.Segment.Offset + 2).ToString(), (node.Segment.Offset + 2).ToString()));
                        }
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在(eE)范围内", (node.Segment.Offset + 1).ToString(), (node.Segment.Offset + 1).ToString()));
                    }
                }
                break;
                }

                #endregion month

                /*获取年份*/
                space += 3;
                for (var i = space; i < value.Length; i++)
                {
                    if (value[i] == ' ')
                    {
                        break;
                    }

                    space++;
                }
                int year = GetGigitInZeroToNightChar(value[space + 1]) * 1000 + GetGigitInZeroToNightChar(value[space + 2]) * 100 + GetGigitInZeroToNightChar(value[space + 3]) * 10 + GetGigitInZeroToNightChar(value[space + 4]);

                /*获取小时*/
                space += 4;
                for (var i = space; i < value.Length; i++)
                {
                    if (value[i] == ' ')
                    {
                        break;
                    }

                    space++;
                }

                int hour = GetGigitInZeroToNightChar(value[space + 1]) * 10 + GetGigitInZeroToNightChar(value[space + 2]);

                /*获取分钟*/
                int minute = GetGigitInZeroToNightChar(value[space + 4]) * 10 + GetGigitInZeroToNightChar(value[space + 5]);

                /*获取秒数*/
                int second = GetGigitInZeroToNightChar(value[space + 7]) * 10 + GetGigitInZeroToNightChar(value[space + 8]);

                return(new DateTime(year, month, day, hour, minute, second));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override TimeSpan Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(TimeSpan.Zero);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(TimeSpan.Zero);
            }

            if (checkNullValue && this.IsNullValue(value))
            {
                return(TimeSpan.Zero);
            }

            int point = 0;

            for (var i = 0; i < value.Length; i++)
            {
                if (value[i] == ':')
                {
                    goto _noday;
                }

                if (value[i] == '.')
                {
                    break;
                }

                point++;
            }

            goto _hasday;

_noday:
            {
                try
                {
                    point = 0;
                    int hour = 0;
                    if (value.Length >= point + 2)
                    {
                        hour = GetGigitInZeroToNightChar(value[0]) * 10 + GetGigitInZeroToNightChar(value[1]);
                    }
                    point += 3;

                    int minute = 0;
                    if (value.Length >= point + 2)
                    {
                        minute = GetGigitInZeroToNightChar(value[point]) * 10 + GetGigitInZeroToNightChar(value[point + 1]);
                    }
                    point += 3;

                    int second = 0;
                    if (value.Length >= point + 2)
                    {
                        second = GetGigitInZeroToNightChar(value[point]) * 10 + GetGigitInZeroToNightChar(value[point + 1]);
                    }
                    point += 3;

                    int mill = 0;
                    if (value.Length >= point + 3)
                    {
                        mill = GetGigitInZeroToNightChar(value[point]) * 100 + GetGigitInZeroToNightChar(value[point + 1]) * 10 + GetGigitInZeroToNightChar(value[point + 2]);
                    }

                    return(new TimeSpan(0, hour, minute, second, mill));
                }
                catch (OverflowException)
                {
                    throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                }
                catch
                {
                    throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                }
            };

_hasday:
            {
                try
                {
                    int day = 0;
                    for (var i = 0; i < point; i++)
                    {
                        day += GetGigitInZeroToNightChar(value[i]) * (int)GetInteger(point - i);
                    }

                    int hour = 0;
                    if (value.Length >= point + 2)
                    {
                        hour = GetGigitInZeroToNightChar(value[point + 1]) * 10 + GetGigitInZeroToNightChar(value[point + 2]);
                    }
                    point += 3;

                    int minute = 0;
                    if (value.Length >= point + 2)
                    {
                        minute = GetGigitInZeroToNightChar(value[point + 1]) * 10 + GetGigitInZeroToNightChar(value[point + 2]);
                    }
                    point += 3;

                    int second = 0;
                    if (value.Length >= point + 2)
                    {
                        second = GetGigitInZeroToNightChar(value[point + 1]) * 10 + GetGigitInZeroToNightChar(value[point + 2]);
                    }
                    point += 3;

                    int mill = 0;
                    if (value.Length >= point + 3)
                    {
                        mill = GetGigitInZeroToNightChar(value[point + 1]) * 100 + GetGigitInZeroToNightChar(value[point + 2]) * 10 + GetGigitInZeroToNightChar(value[point + 3]);
                    }

                    return(new TimeSpan(day, hour, minute, second, mill));
                }
                catch (OverflowException)
                {
                    throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                }
                catch
                {
                    throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                }
            };
        }
Example #26
0
 /// <summary>
 /// 反序列化对象
 /// </summary>
 /// <param name="reader">读取器</param>
 /// <param name="targetType">目标类型</param>
 /// <returns></returns>
 public static object DeserializeObject(IDeserializerReader reader, Type targetType)
 {
     return(Deserialize(reader, targetType, DefaultSetting.DefaultDeserializeSetting));
 }
 public static void LoadIntoGenericDictionary <T, V>(IDictionary <T, V> target, IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
 {
     IDictionaryProvider.Default.Load <T, V>(target, reader, setting, name, arrayLevel);
 }
Example #28
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override char Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(default(char));
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(default(char));
            }

            if (checkNullValue && this.IsNullValue(value))
            {
                return(' ');
            }

            if (value.Length == 1)
            {
                return(value[0]);
            }

            if (value.Length == 2)
            {
                return(value[1]);
            }

            if (value[1] != 'u')
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,char取值只能一位", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }

            if (value.Length != 6)
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,char取值只能一位", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }

            var ret = 0;

            for (var i = 2; i < 6; i++)
            {
                switch (value[i])
                {
                case '0':
                {
                }
                break;

                case '1':
                {
                    ret += _16Pow(5 - i);
                }
                break;

                case '2':
                {
                    ret += 2 * _16Pow(5 - i);
                }
                break;

                case '3':
                {
                    ret += 3 * _16Pow(5 - i);
                }
                break;

                case '4':
                {
                    ret += 4 * _16Pow(5 - i);
                }
                break;

                case '5':
                {
                    ret += 5 * _16Pow(5 - i);
                }
                break;

                case '6':
                {
                    ret += 6 * _16Pow(5 - i);
                }
                break;

                case '7':
                {
                    ret += 7 * _16Pow(5 - i);
                }
                break;

                case '8':
                {
                    ret += 8 * _16Pow(5 - i);
                }
                break;

                case '9':
                {
                    ret += 9 * _16Pow(5 - i);
                }
                break;

                case 'a':
                case 'A':
                {
                    ret += 10 * _16Pow(5 - i);
                }
                break;

                case 'b':
                case 'B':
                {
                    ret += 11 * _16Pow(5 - i);
                }
                break;

                case 'c':
                case 'C':
                {
                    ret += 12 * _16Pow(5 - i);
                }
                break;

                case 'd':
                case 'D':
                {
                    ret += 13 * _16Pow(5 - i);
                }
                break;

                case 'e':
                case 'E':
                {
                    ret += 14 * _16Pow(5 - i);
                }
                break;

                case 'f':
                case 'F':
                {
                    ret += 15 * _16Pow(5 - i);
                }
                break;

                default:
                {
                    throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,char取值只能一位", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                }
                }
            }

            return((char)ret);
        }
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="node">节点流内容</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        /// <exception cref="System.ArgumentNullException"></exception>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            try
            {
                int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, mill = 0;
                if (value.Length > 22)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                    second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]);
                    mill   = GetGigitInZeroToNightChar(value[20]) * 100 + GetGigitInZeroToNightChar(value[21]) * 10 + GetGigitInZeroToNightChar(value[22]);
                }
                else if (value.Length > 18)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                    second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]);
                }
                else if (value.Length > 15)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                }
                else if (value.Length > 12)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day   = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour  = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                }
                else if (value.Length > 9)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day   = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                }
                else if (value.Length > 6)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                }
                else
                {
                    year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                }
                //year = GetGigitInZeroToNightChar(node.Value[0]) * 1000 + GetGigitInZeroToNightChar(node.Value[1]) * 100 + GetGigitInZeroToNightChar(node.Value[2]) * 10 + GetGigitInZeroToNightChar(node.Value[3]);
                //month = GetGigitInZeroToNightChar(node.Value[5]) * 10 + GetGigitInZeroToNightChar(node.Value[6]);
                //day = GetGigitInZeroToNightChar(node.Value[8]) * 10 + GetGigitInZeroToNightChar(node.Value[9]);
                //hour = GetGigitInZeroToNightChar(node.Value[11]) * 10 + GetGigitInZeroToNightChar(node.Value[12]);
                //minute = GetGigitInZeroToNightChar(node.Value[14]) * 10 + GetGigitInZeroToNightChar(node.Value[15]);
                //second = GetGigitInZeroToNightChar(node.Value[17]) * 10 + GetGigitInZeroToNightChar(node.Value[18]);
                //if (node.Value.Length > 22)
                //    mill = GetGigitInZeroToNightChar(node.Value[20]) * 100 + GetGigitInZeroToNightChar(node.Value[21]) * 10 + GetGigitInZeroToNightChar(node.Value[22]);

                return(new DateTime(year, month, day, hour, minute, second, mill));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
Example #30
0
        /// <summary>
        /// 装载数据到字典中
        /// </summary>
        /// <param name="dictionary">The result.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="name">The name.</param>
        /// <param name="arrayLevel"></param>
        public virtual void LoadStringKeyStringvalue(IDictionary <string, string> dictionary, IDeserializerReader reader, JsonDeserializeSetting setting, string name, int arrayLevel)
        {
            var node = reader.Read(name);

            if (node == null)
            {
                if (name != null)
                {
                    return;
                }

                while (true)
                {
                    var item = reader.MoveNext();
                    if (item == null)
                    {
                        break;
                    }

                    var key = ZzzZzDeserializerBuilder <string> .Register(setting).Invoke(ThunderReader.Load(item.Key), setting, arrayLevel);

                    if (string.IsNullOrEmpty(key))
                    {
                        continue;
                    }

                    var itemValue = item.GetValue();
                    if (itemValue == null)
                    {
                        dictionary[key] = "";
                        continue;
                    }

                    dictionary[item.Key] = item.ToString();
                    //if (item.NodeType == ContentNodeType.String)
                    //{
                    //    dictionary[key] = new string(itemValue);
                    //}
                    //else
                    //{
                    //    dictionary[item.Key] = item.ToString();
                    //}
                }

                return;
            }

            if (node.NodeType == ContentNodeType.String)
            {
                return;
            }

            if (node.NodeType != ContentNodeType.Object)
            {
                throw new ArgumentException(string.Format("字典只能为key-value形式,当前形式为{0}", node.NodeType.ToString()));
            }

            foreach (var item in (IList <JsonContentNode>)node.Node)
            {
                var key = ZzzZzDeserializerBuilder <string> .Register(setting).Invoke(ThunderReader.Load(item.Key), setting, arrayLevel);

                if (string.IsNullOrEmpty(key))
                {
                    continue;
                }

                var nValue = item == null ? ArraySegmentValue.Empty : item.GetValue();
                if (nValue.IsNullOrEmpty)
                {
                    dictionary[key] = "";
                    continue;
                }

                dictionary[item.Key] = item.ToString();
                //if (item.NodeType == ContentNodeType.String)
                //{
                //    dictionary[key] = new string(nValue);
                //}
                //else
                //{
                //    dictionary[item.Key] = item.ToString();
                //}
            }
        }