Ejemplo n.º 1
0
        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;
		}
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
		/// <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);
		}