Last active
December 21, 2015 21:29
-
-
Save BrandonBrowning/6368168 to your computer and use it in GitHub Desktop.
Simple Json Parser in F# (with FParsec, very lightly tested)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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