private void ParseString(char quote) { bool stringTerminated = false; while (!stringTerminated && MoveNext()) { switch (_currentChar) { //case 0: //case 0x0A: //case 0x0D: // throw new JsonReaderException("Unterminated string"); case '\\': if (MoveNext()) { switch (_currentChar) { case 'b': _buffer.Append('\b'); break; case 't': _buffer.Append('\t'); break; case 'n': _buffer.Append('\n'); break; case 'f': _buffer.Append('\f'); break; case 'r': _buffer.Append('\r'); break; case 'u': //Try parsing unicode character; like Pi (\u03a0) or Sigma (\u03a3). bool IsUnicode = true; StringBuffer unicodeBuff = new StringBuffer(); for (int i = 0; i < 4; i++) { if (Char.IsLetterOrDigit(this.PeekNext())) { this.MoveNext(); unicodeBuff.Append(_currentChar); } else { IsUnicode = false; break; } } if (IsUnicode) { int number; if (Int32.TryParse(unicodeBuff.ToString(), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out number)) { //Its Unicode. _buffer.Append((char)(number)); break; } } //Not Unicode. _buffer.Append('\\'); _buffer.Append('u'); char[] temp = unicodeBuff.ToString().ToCharArray(); for (int i = 0; i < temp.Length; i++) { _buffer.Append(temp[i]); } break; case 'x': //_buffer.Append((char) Integer.parseInt(next(2), 16)); break; default: _buffer.Append(_currentChar); break; } } else { throw new JsonReaderException("Unterminated string. Expected delimiter: " + quote); } break; case '"': case '\'': if (_currentChar == quote) stringTerminated = true; else goto default; break; default: _buffer.Append(_currentChar); break; } } if (!stringTerminated) throw new JsonReaderException("Unterminated string. Expected delimiter: " + quote); ClearCurrentChar(); _currentState = State.PostValue; DateTime checkTime; if (DateTime.TryParse(_buffer.ToString(), out checkTime)) { _token = JsonToken.Date; _value = checkTime; _valueType = typeof(DateTime); } else { _token = JsonToken.String; _value = _buffer.ToString(); _valueType = typeof(string); } _buffer.Position = 0; _quoteChar = quote; }
private void ParseString(char quote) { bool stringTerminated = false; while (!stringTerminated && MoveNext()) { switch (_currentChar) { //case 0: //case 0x0A: //case 0x0D: // throw new JsonReaderException("Unterminated string"); case '\\': if (MoveNext()) { switch (_currentChar) { case 'b': _buffer.Append('\b'); break; case 't': _buffer.Append('\t'); break; case 'n': _buffer.Append('\n'); break; case 'f': _buffer.Append('\f'); break; case 'r': _buffer.Append('\r'); break; case 'u': //Try parsing unicode character; like Pi (\u03a0) or Sigma (\u03a3). bool IsUnicode = true; StringBuffer unicodeBuff = new StringBuffer(); for (int i = 0; i < 4; i++) { if (Char.IsLetterOrDigit(this.PeekNext())) { this.MoveNext(); unicodeBuff.Append(_currentChar); } else { IsUnicode = false; break; } } if (IsUnicode) { int number; if (Int32.TryParse(unicodeBuff.ToString(), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out number)) { //Its Unicode. _buffer.Append((char)(number)); break; } } //Not Unicode. _buffer.Append('\\'); _buffer.Append('u'); char[] temp = unicodeBuff.ToString().ToCharArray(); for (int i = 0; i < temp.Length; i++) { _buffer.Append(temp[i]); } break; case 'x': //_buffer.Append((char) Integer.parseInt(next(2), 16)); break; default: _buffer.Append(_currentChar); break; } } else { throw new JsonReaderException("Unterminated string. Expected delimiter: " + quote); } break; case '"': case '\'': if (_currentChar == quote) { stringTerminated = true; } else { goto default; } break; default: _buffer.Append(_currentChar); break; } } if (!stringTerminated) { throw new JsonReaderException("Unterminated string. Expected delimiter: " + quote); } ClearCurrentChar(); _currentState = State.PostValue; DateTime checkTime; if (DateTime.TryParse(_buffer.ToString(), out checkTime)) { _token = JsonToken.Date; _value = checkTime; _valueType = typeof(DateTime); } else { _token = JsonToken.String; _value = _buffer.ToString(); _valueType = typeof(string); } _buffer.Position = 0; _quoteChar = quote; }
/// <summary> /// Initializes a new instance of the <see cref="JsonReader"/> class with the specified <see cref="TextReader"/>. /// </summary> /// <param name="reader">The <c>TextReader</c> containing the XML data to read.</param> public JsonReader(TextReader reader) { if (reader == null) throw new ArgumentNullException("reader"); _reader = reader; _buffer = new StringBuffer(4096); //_testBuffer = new StringBuilder(); _currentState = State.Start; _stack = new List<JsonType>(); _top = 0; Push(JsonType.None); }