/// <summary> /// 读取字符串并存入 dict /// </summary> /// <param name="str"></param> /// <param name="offset"></param> /// <param name="line"></param> /// <param name="column"></param> private void ReadObject(SimpleReader reader) { const char head = '{'; const char tail = '}'; if (reader.Char() != head) { throw new ParseException("异常调用,类型不符", reader); } while (true) { reader.JumpSpace(); var key = ReadStringValue(reader); if (key == null) { break; } reader.JumpSpace(); if (reader.Char() != ':') { throw new ParseException("ReadObject 找不到分隔符", reader); } var valueType = TestValueType(reader); string valueStr; switch (valueType) { case ObjectTypes.Array: valueStr = ReadPairValue(reader, '[', ']'); break; case ObjectTypes.Object: valueStr = ReadPairValue(reader, '{', '}'); break; case ObjectTypes.String: valueStr = '"' + ReadStringValue(reader) + '"'; break; case ObjectTypes.Boolean: valueStr = ReadBooleanValue(reader); break; case ObjectTypes.Number: valueStr = ReadNumberValue(reader); break; default: throw new NotImplementedException(); } _dict.Add(key, valueStr); if (reader.Peek(true) == null || reader.Char() == tail) { break; } } }
/// <summary> /// 读取由 "{" 与 "}" 包围的字符串。 /// 要求光标被放在开头的 "{" 位置上。 /// 读取结果将包含开头的 "{" 与结尾的 "}"。 /// </summary> /// <param name="reader"></param> /// <returns></returns> private void ReadArray(SimpleReader reader) { const char head = '['; const char tail = ']'; if (reader.Peek(false) == null || reader.Char() != head) { throw new ParseException("非法调用 ReadArrayValue", reader); } var key = 0; while (true) { var valueType = TestValueType(reader); string valueStr; switch (valueType) { case ObjectTypes.Array: valueStr = ReadPairValue(reader, '[', ']'); break; case ObjectTypes.Object: valueStr = ReadPairValue(reader, '{', '}'); break; case ObjectTypes.String: valueStr = '"' + ReadStringValue(reader) + '"'; break; case ObjectTypes.Number: valueStr = ReadNumberValue(reader); break; default: throw new NotImplementedException(); } _dict.Add(key.ToString(), valueStr); key++; if (reader.Peek(true) == null) { break; } var c = reader.Char(); if (c == ',') { continue; } if (c == tail) { break; } throw new ParseException(" ReadArrayValue 解析异常。", reader); } }
/// <summary> /// 读取由双引号["]包围的字符串内容,开头必须有 ["] 并且结果的 ["] 也将被跳过,读取内容不包含双引号 /// 要求当标必须被放在 开头的["] 上面 /// </summary> /// <param name="reader"></param> /// <returns></returns> private string ReadStringValue(SimpleReader reader) { if (reader.Char() != '"') { throw new ParseException("非法调用 ReadStringValue。", reader); } var key = new StringBuilder(); char?last = null; foreach (var c in reader) { switch (c) { case '\"': if (last == '\\') { key.Append('\"'); break; } return(key.ToString()); case '\n': throw new ParseException("ReadStringValue 解析异常。", reader); case '\r': throw new ParseException("ReadStringValue 解析异常。", reader); default: key.Append(c); break; } last = c; } throw new ParseException("ReadStringValue 解析异常。", reader); }