public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); if (chr != '[') { return(null); } reader.SkipChar(); List <XTJsonData> items = new List <XTJsonData>(); XTJsonData item = null; do { chr = reader.CurrUnemptyChar(); // 尝试性探测下一个字符 if (chr == ']') // 字典结束 { break; } else if (chr == ',') // 元素结束 { reader.SkipChar(); if (item == null) // 错误:{,} { reader.RaiseInvalidException(); } chr = reader.CurrUnemptyChar(); if (chr == ',') // 双逗号分隔错误:[xx, , yy} { reader.RaiseInvalidException(); } if (chr == ']') // 逗号加括号结束:[xx, yy, ] { break; // JSON 本身是不允许的,我这里允许 } } item = reader.ParsePart(); if (item == null) { reader.RaiseInvalidException(); } items.Add(item); } while (chr > 0); if (reader.NextUnemptyChar() != ']') { reader.RaiseInvalidException(); } return(new XTJsonList(items)); }
public static bool ParsePart(XTJsonReader reader, List <XTJsonComment> doc) { int first = reader.CurrUnemptyChar(); if (first <= 0) { return(false); // 文档结束 } if (first != '/') { return(false); // 非注释区 } reader.SkipChar(); int snd = reader.NextChar(); // 第二个字符 if (snd == '/') // 单行注释 { ParseSingleLine(reader, doc); } else if (snd == '*') // 多行注释 { ParseMultiLine(reader, doc); } else { reader.RaiseInvalidException(); // JSON 格式错误 } return(true); }
public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); if (chr != '\"') { return(null); } reader.SkipChar(); StringBuilder sb = new StringBuilder(); do { chr = reader.NextChar(); if (chr == '\"') // 字符串结束 { return(new XTJsonString(sb.ToString())); } else if (chr == '\\') // 转移符 { sb.Append(TakeESC(reader)); } else { sb.Append((char)chr); } } while (chr > 0); reader.RaiseInvalidException(); return(null); }
public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); if (chr != '{') { return(null); } reader.SkipChar(); // 去掉左括号 Dict dict = new Dict(); bool isEmpty = true; DictItem item; do { chr = reader.CurrUnemptyChar(); // 尝试性探测下一个字符 if (chr == '}') // 字典结束 { break; } else if (chr == ',') // 元素结束 { reader.SkipChar(); if (isEmpty) // 错误:{,} { reader.RaiseInvalidException(); } chr = reader.CurrUnemptyChar(); if (chr == ',') // 双逗号分隔错误:{xx: yy, , uu: vv} { reader.RaiseInvalidException(); } if (chr == '}') // 逗号加括号结束:{xx: yy, uu: vv, } { break; // JSON 本身是不允许的,我这里允许 } } item = ParseItem(reader); dict[item.Key] = item.Value; // 允许添加重复键(dict.Add(...),将不许添加重复键) isEmpty = false; }while(chr > 0); if (reader.NextUnemptyChar() != '}') { reader.RaiseInvalidException(); } return(new XTJsonDict(dict)); }
public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); if (chr != 'n') { return(null); } string text = reader.NextBlock(4); if (text != "null") { reader.RaiseInvalidException(); } return(XTJsonNone.Inst); }
public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); switch (chr) { case '-': reader.SkipChar(); return(Parse(reader, reader.NextChar(), true)); case '+': reader.SkipChar(); return(Parse(reader, reader.NextChar(), false)); case '.': reader.SkipChar(); return(ParseDouble(reader, "0", false)); case '0': reader.SkipChar(); chr = reader.CurrChar(); if (chr == 'x' || chr == 'X') { reader.SkipChar(); return(ParseHIntLong(reader, false)); } else { return(Parse(reader, '0', false)); } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return(Parse(reader, reader.NextChar(), false)); } return(null); }
public static XTJsonData Parse(XTJsonReader reader) { int chr = reader.CurrUnemptyChar(); if (chr == 't') { string text = reader.NextBlock(4); if (text == "true") { return(new XTJsonBool(true)); } reader.RaiseInvalidException(); } else if (chr == 'f') { string text = reader.NextBlock(5); if (text == "false") { return(new XTJsonBool(false)); } reader.RaiseInvalidException(); } return(null); }