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); } } } }
/// <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)); } } }
/// <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(':'); //失败,终止方法 } }
/// <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); }
/// <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); } } }
/// <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; }
/// <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(':'); //失败,终止方法 } }
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); } } } }