NAMESPACE_UPP Value ParseJSON(CParser& p) { p.UnicodeEscape(); if(p.IsDouble()) return p.ReadDouble(); if(p.IsString()) { bool dt = p.IsChar2('\"', '\\'); String s = p.ReadString(); if(dt) { CParser p(s); if(p.Char('/') && p.Id("Date") && p.Char('(') && p.IsInt()) { int64 n = p.ReadInt64(); if(!IsNull(n)) return Time(1970, 1, 1) + n / 1000; } } return s; } if(p.Id("null")) return Null; if(p.Id("true")) return true; if(p.Id("false")) return false; if(p.Char('{')) { ValueMap m; while(!p.Char('}')) { String key = p.ReadString(); p.PassChar(':'); m.Add(key, ParseJSON(p)); if(p.Char('}')) // Stray ',' at the end of list is allowed... break; p.PassChar(','); } return m; } if(p.Char('[')) { ValueArray va; while(!p.Char(']')) { va.Add(ParseJSON(p)); if(p.Char(']')) // Stray ',' at the end of list is allowed... break; p.PassChar(','); } return va; } p.ThrowError("Unrecognized JSON element"); return Null; }
void Pdb::ExpandTreeType(int parent, CParser& p) { for(;;) { String id; if(p.Char('*')) id = "*"; if(p.IsId()) id << p.ReadId(); else break; for(;;) if(p.Char('<')) id << '<'; else if(p.Char('>')) id << '>'; else if(p.Char(',')) id << ','; else if(p.IsInt()) id << AsString(p.ReadInt()); else if(p.IsString()) id << '\"' << AsCString(p.ReadString()) << '\"'; else if(p.IsId()) id << p.ReadId(); else break; int n = tree.GetChildCount(parent); for(int i = 0; i < n; i++) { int child = tree.GetChild(parent, i); const NamedVal& nv = ValueTo<NamedVal>(tree.Get(child)); if(nv.name == id) { tree.Open(child); if(p.Char('{')) { ExpandTreeType(child, p); p.PassChar('}'); } break; } } p.Char(';'); } }