示例#1
0
        private void FillObject(object obj, ZTReflector lit, string json)
        {
            if (json == null || json.Length == 0)
            {
                return;
            }

            unsafe
            {
                fixed(char *p = json)
                {
                    UnsafeJsonReader reader = new UnsafeJsonReader(p, json.Length);

                    if (reader.IsEnd())
                    {
                        return;
                    }

                    if (reader.Current == '{')
                    {
                        reader.MoveNext();
                        FillObject(obj, lit, reader);
                        if (reader.Current != '}')
                        {
                            ThrowMissingCharException('}');
                        }
                    }
                    else if (reader.Current == '[')
                    {
                        reader.MoveNext();
                        var st = GenericCollection.GetList(obj.GetType());
                        if (st == null)
                        {
                            ThrowNoIList(obj.GetType());
                        }
                        FillList((IList)obj, st.ElementType, reader);

                        if (reader.Current != ']')
                        {
                            ThrowMissingCharException(']');
                        }
                    }
                    else
                    {
                        ThrowException("起始字符:" + reader.Current);
                    }
                    reader.MoveNext();
                    if (reader.IsEnd())
                    {
                        reader.Dispose();
                    }
                    else
                    {
                        ThrowException("错误的结束字符:" + reader.Current);
                    }
                }
            }
        }
示例#2
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();
                if (val == null)
                {
                    return(null);
                }
                if (type.IsInstanceOfType(val) == false)
                {
                    val = Convert.ChangeType(val, type);
                }
                return(val);
            }
            }
        }
示例#3
0
        /// <summary> 跳过一个值
        /// </summary>
        /// <param name="reader"></param>
        private void SkipValue(UnsafeJsonReader reader)
        {
            reader.SkipWhiteChar();
            switch (reader.Current)
            {
            case '[':
                reader.MoveNext();
                if (reader.SkipChar(']'))
                {
                    return;
                }
                do
                {
                    SkipValue(reader);
                } while (reader.SkipChar(','));
                if (reader.Current != ']')
                {
                    ThrowException("缺少闭合的 ]");
                }
                reader.MoveNext();
                break;

            case '{':
                reader.MoveNext();
                if (reader.SkipChar('}'))
                {
                    return;
                }
                do
                {
                    ReadKey(reader);
                    SkipValue(reader);
                } while (reader.SkipChar(','));
                if (reader.Current != '}')
                {
                    ThrowException("缺少闭合的 }");
                }
                reader.MoveNext();
                break;

            case '"':
            case '\'':
                reader.SkipString();
                break;

            default:
                reader.ReadConsts();
                break;
            }
        }