/// <summary>读取一个Json对象值</summary> /// <param name="reader"></param> /// <returns></returns> private SimpleJson ReadObject(JsonAtomStringReader reader) { var d = new Dictionary <string, SimpleJson>(); bool isContinue = true; do { var k = Read(reader); if (k == null) { break; } else if (k.IsUndefined || k.IsUnknown) { if (k.Value != null && k.Value.ToString() == ",") { continue; } else { break; } } var split = Read(reader); if (split == null) { break; } else if (split.IsUndefined || split.IsUnknown) { if (split.Value != null && split.Value.ToString() == ":") { // 继续执行下面的 } else { break; } } var v = Read(reader); if (v == null) { v = Undefined(); } else if (v.IsUndefined || v.IsUnknown) { isContinue = false; } d.Add(k.Value.ToString(), v); } while (isContinue); return(new SimpleJson() { Type = SimpleJsonType.Object, Value = d }); }
/// <summary>读取一个数组值</summary> /// <returns></returns> private SimpleJson ReadArray(JsonAtomStringReader reader) { var d = new List <SimpleJson>(); bool hasSplit = true; do { var v = Read(reader); if (v == null) { break; } else if (v.IsUndefined || v.IsUnknown) { if (v.Value != null && v.Value.ToString() == ",") { if (hasSplit) { v = Undefined(); } else { hasSplit = true; continue; } } else { break; } } else { hasSplit = false; } d.Add(v); } while (true); return(new SimpleJson() { Type = SimpleJsonType.Array, Value = d }); }
/// <summary>从指定文本读取流读出Json值</summary> /// <param name="r"></param> /// <returns></returns> public SimpleJson From(TextReader r) { var reader = new JsonAtomStringReader(r); reader.SingleQuotesString = true; if (BeginFromJson != null) { var e = new EventArgs <JsonAtomStringReader>(reader); BeginFromJson(this, e); reader = e.Arg; } var ret = Read(reader); if (EndFromJson != null) { var e = new EventArgs <JsonAtomStringReader, SimpleJson>(reader, ret); EndFromJson(this, e); ret = e.Arg2; } return(ret); }
/// <summary>从指定Json原子元素读取流读出一个Json值,包括对象和数组</summary> /// <param name="reader"></param> /// <returns></returns> private SimpleJson Read(JsonAtomStringReader reader) { SimpleJson ret = null; string str; var t = reader.Read(false, out str); var retType = SimpleJsonType.Unknown; switch (t) { case JsonAtomType.NONE: break; case JsonAtomType.BRACE_OPEN: ret = ReadObject(reader); break; case JsonAtomType.BRACKET_OPEN: ret = ReadArray(reader); break; case JsonAtomType.TRUE: case JsonAtomType.FALSE: ret = Boolean(t == JsonAtomType.TRUE); break; case JsonAtomType.NULL: ret = Null(); break; case JsonAtomType.NUMBER: case JsonAtomType.NUMBER_EXP: ret = ParseInteger(str); break; case JsonAtomType.FLOAT: case JsonAtomType.FLOAT_EXP: ret = ParseFloat(str); break; case JsonAtomType.STRING: retType = SimpleJsonType.String; goto default; case JsonAtomType.LITERAL: retType = SimpleJsonType.Literal; goto default; case JsonAtomType.BRACE_CLOSE: case JsonAtomType.BRACKET_CLOSE: case JsonAtomType.COMMA: retType = SimpleJsonType.Undefined; goto default; case JsonAtomType.COLON: default: ret = new SimpleJson() { Type = retType, Value = str }; break; } if (ret != null) { if (FromJson != null) { var e = new EventArgs <JsonAtomStringReader, SimpleJson, JsonAtomType>(reader, ret, t); FromJson(this, e); ret = e.Arg2; } } return(ret); }