# Not lexing correctly
Your lexer does not handle strings properly:

```python
from json import dumps, loads

utf8_string = '"A quoted random UTF-8 string €.'
json = dumps(utf8_string)
print(loads(json))
l = Lexer(json)
l.parse()
l.pprint()
```
Results in:
```
python .\jsonlex.py
"A quoted random UTF-8 string €.
Traceback (most recent call last):
  File "C:\Users\Richard Neumann\Desktop\jsonlex.py", line 59, in <module>
    l.parse()
  File "C:\Users\Richard Neumann\Desktop\jsonlex.py", line 49, in parse
    tok = self.getNextToken()
          ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Richard Neumann\Desktop\jsonlex.py", line 45, in getNextToken
    raise RuntimeError("Unrecognized token at position %d -- '%s'" % (self.idx, substring[:5]))
RuntimeError: Unrecognized token at position 0 -- '"\"A '
```
Which, as you can see from the comparison to the `json` library should be a totally fine JSON string.

You should consider writing unit test for your lexer and testing it against valid JSON input such as above.

# Outdated Python version
Judging from the use of the `print` statement you seem to be using Python 2.x which is unmaintained for two years now.
Switch to Python 3 for all future projects.

# Use custom exceptions
Consider using a custom exception, such as

```python
class JSONLexingError(Exception):
    """Indicate an error when lexing a JSON string."""
```
to indicate errors during lexing instead of using a bare `RuntimeError`.