Exemple #1
0
        private void FillObject(ref object obj, Literacy 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();
                        if (obj == null) {
                            obj = new Dictionary<string, object>();
                            lit = Literacy.Cache(typeof(Dictionary<string, object>), true);
                        }
                        FillObject(obj, lit, reader);
                        if (reader.Current != '}') {
                            ThrowMissingCharException('}');
                        }
                    } else if (reader.Current == '[') {
                        reader.MoveNext();

                        if (obj == null) {
                            obj = new ArrayList();
                            FillList((IList)obj, typeof(object), reader);
                        } else if (obj is ArrayList) {
                            FillList((IList)obj, lit.Type, reader);
                        } else {
                            var st = GenericCollection.GetList(lit.Type);
                            if (st == null) {
                                ThrowNoIList(lit.Type);
                            }
                            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);
                    }
                }
            }
        }
Exemple #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();
                return(ChangeType(val, type));
            }
            }
        }
Exemple #3
0
 /// <summary> 跳过一个键
 /// </summary>
 /// <param name="reader"></param>
 private static void SkipKey(UnsafeJsonReader reader)
 {
     if (reader.IsEnd())
     {
         ThrowException("字符串意外结束!");
     }
     if (reader.Current == '"' || reader.Current == '\'')
     {
         reader.SkipString();
     }
     else
     {
         reader.SkipWord();
     }
     if (reader.SkipChar(':') == false)  //跳过:号
     {
         ThrowMissingCharException(':'); //失败,终止方法
     }
 }
Exemple #4
0
        /// <summary> 获取一个键
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private static string ReadKey(UnsafeJsonReader reader)
        {
            if (reader.IsEnd())
            {
                ThrowException("字符串意外结束!");
            }
            string key;

            if (reader.Current == '"' || reader.Current == '\'')
            {
                key = reader.ReadString();
            }
            else
            {
                key = reader.ReadWord();
            }
            if (reader.SkipChar(':') == false)  //跳过:号
            {
                ThrowMissingCharException(':'); //失败,终止方法
            }
            return(key);
        }
Exemple #5
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);
             }
     }
 }
Exemple #6
0
 /// <summary> 获取一个键
 /// </summary>
 /// <param name="reader"></param>
 /// <returns></returns>
 private static string ReadKey(UnsafeJsonReader reader) {
     if (reader.IsEnd()) {
         ThrowException("字符串意外结束!");
     }
     string key;
     if (reader.Current == '"' || reader.Current == '\'') {
         key = reader.ReadString();
     } else {
         key = reader.ReadWord();
     }
     if (reader.SkipChar(':') == false)//跳过:号
     {
         ThrowMissingCharException(':'); //失败,终止方法
     }
     return key;
 }
Exemple #7
0
 /// <summary> 跳过一个键
 /// </summary>
 /// <param name="reader"></param>
 private static void SkipKey(UnsafeJsonReader reader) {
     if (reader.IsEnd()) {
         ThrowException("字符串意外结束!");
     }
     if (reader.Current == '"' || reader.Current == '\'') {
         reader.SkipString();
     } else {
         reader.SkipWord();
     }
     if (reader.SkipChar(':') == false)//跳过:号
     {
         ThrowMissingCharException(':'); //失败,终止方法
     }
 }
Exemple #8
0
        private void FillObject(ref object obj, Literacy 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();
                        if (obj == null)
                        {
                            obj = new Dictionary <string, object>();
                            lit = Literacy.Cache(typeof(Dictionary <string, object>), true);
                        }
                        FillObject(obj, lit, reader);
                        if (reader.Current != '}')
                        {
                            ThrowMissingCharException('}');
                        }
                    }
                    else if (reader.Current == '[')
                    {
                        reader.MoveNext();

                        if (obj == null)
                        {
                            obj = new ArrayList();
                            FillList((IList)obj, typeof(object), reader);
                        }
                        else if (obj is ArrayList)
                        {
                            FillList((IList)obj, lit.Type, reader);
                        }
                        else
                        {
                            var st = GenericCollection.GetList(lit.Type);
                            if (st == null)
                            {
                                ThrowNoIList(lit.Type);
                            }
                            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);
                    }
                }
            }
        }