Skip to content

Instantly share code, notes, and snippets.

@BrandonBrowning
Last active December 21, 2015 21:29
Show Gist options
  • Save BrandonBrowning/6368168 to your computer and use it in GitHub Desktop.
Save BrandonBrowning/6368168 to your computer and use it in GitHub Desktop.
Simple Json Parser in F# (with FParsec, very lightly tested)
open System
open FParsec
type Json =
| JsonObject of (string * Json) list
| JsonArray of Json list
| JsonNumber of double
| JsonString of string
type 'a parser = Parser<'a, unit>
let parseJson, parseJsonRef = createParserForwardedToRef()
let parseIdentifier: string parser = manyChars (noneOf "\"")
let parseString = pchar '"' >>. parseIdentifier .>> pchar '"'
let parseJString = parseString <?> "string" |>> JsonString
let parseJNumber = pfloat <?> "number" |>> JsonNumber
let parseJArray =
pchar '[' >>. spaces >>. sepBy parseJson (pchar ',' .>> spaces) .>> spaces .>> pchar ']'
<?> "array"
|>> JsonArray
let parseJProperty =
(parseString .>> spaces) .>>. (pchar ':' >>. spaces >>. parseJson)
<?> "property"
let parseJObject =
pchar '{' >>. spaces >>. sepBy parseJProperty (spaces >>. pchar ',' .>> spaces) .>> spaces .>> pchar '}'
<?> "object"
|>> JsonObject
parseJsonRef := choice [
parseJString;
parseJNumber;
parseJArray;
parseJObject
]
let testText = "{\"a\": {\"y\": {}}, \"b\": [\"z\", [], {}], \"c\": []}"
[<EntryPoint>]
let main argv =
testText |> printfn "%s"
run parseJson testText |> printfn "%A"
0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment