JSON Lexer
1 Lexer
token
lexer?
make-lexer
lexer-peek
lexer-take
2 Pretty Printer
pretty-print-json
8.12

JSON Lexer🔗ℹ

Bogdan Popa <bogdan@defn.io>

This package provides an implementation of a JSON lexer and pretty printer, suitable for implementing text highlighting and formatting functionality.

1 Lexer🔗ℹ

 (require json/lexer) package: json-lexer-lib

struct

(struct token (type str val line col pos)
    #:extra-constructor-name make-token
    #:prefab)
  type : symbol?
  str : string?
  val : any/c
  line : (or/c #f exact-positive-integer?)
  col : (or/c #f exact-nonnegative-integer?)
  pos : exact-nonnegative-integer?
The structure that represents tokens read from the input.

procedure

(lexer? v)  boolean?

  v : any/c
Returns #t when v is a lexer.

procedure

(make-lexer in    
  [#:partial-strings? partial-strings?])  lexer?
  in : input-port?
  partial-strings? : boolean? = #f
Returns a lexer that reads data from in. When partial-strings? is #t, an incomplete string at the end of the input is not considered an error.

Examples:
> (require json/lexer)
> (define inp (open-input-string "[1, 2, true, {}]"))
> (port-count-lines! inp)
> (define l (make-lexer inp))
> (let loop ()
    (define t (lexer-take l))
    (unless (eq? (token-type t) 'eof)
     (println t)
     (loop)))

'#s(token lsqbrace "[" "[" 1 0 1)

'#s(token number "1" 1 1 1 2)

'#s(token comma "," "," 1 2 3)

'#s(token whitespace " " " " 1 3 4)

'#s(token number "2" 2 1 4 5)

'#s(token comma "," "," 1 5 6)

'#s(token whitespace " " " " 1 6 7)

'#s(token keyword "true" #t 1 7 8)

'#s(token comma "," "," 1 11 12)

'#s(token whitespace " " " " 1 12 13)

'#s(token lcubrace "{" "{" 1 13 14)

'#s(token rcubrace "}" "}" 1 14 15)

'#s(token rsqbrace "]" "]" 1 15 16)

procedure

(lexer-peek l)  token?

  l : lexer?
Returns the next token in the input stream without consuming it.

procedure

(lexer-take l)  token?

  l : lexer?
Reads the next token from the input stream.

2 Pretty Printer🔗ℹ

 (require json/pretty) package: json-lexer-lib

procedure

(pretty-print-json in [out #:width width])  void?

  in : (or/c string? input-port?)
  out : output-port? = (current-output-port)
  width : exact-positive-integer? = 2
Streams JSON tokens from in and writes indented output to out. Minimal validation is performed at the token level, but not higher, which means that some malformed inputs are accepted.

The width parameter controls the number of spaces used per indentation depth.

Examples:
> (require json/pretty)
> (pretty-print-json "[1, 2, {}, {\"a\": 1.5e+10, \"b\": []}]")

[

  1,

  2,

  {},

  {

    "a": 1.5e+10,

    "b": []

  }

]

> (pretty-print-json "1 2 3 [] [\"\\u03bbambda\"]")

1 2 3 [] [

  "\u03bbambda"

]