json: add single-pass parser