{"id":51511218,"url":"https://github.com/dwayne/hs-json-parser","last_synced_at":"2026-07-08T06:30:37.742Z","repository":{"id":368176119,"uuid":"1230791929","full_name":"dwayne/hs-json-parser","owner":"dwayne","description":"A JSON parser compliant with RFC 8259.","archived":false,"fork":false,"pushed_at":"2026-06-29T10:10:45.000Z","size":114,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-29T12:10:13.168Z","etag":null,"topics":["haskell","json","json-parser","parser","pretty-printer","rfc8259"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dwayne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-06T10:22:04.000Z","updated_at":"2026-06-29T10:10:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dwayne/hs-json-parser","commit_stats":null,"previous_names":["dwayne/hs-json-parser"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/dwayne/hs-json-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwayne%2Fhs-json-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwayne%2Fhs-json-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwayne%2Fhs-json-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwayne%2Fhs-json-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dwayne","download_url":"https://codeload.github.com/dwayne/hs-json-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwayne%2Fhs-json-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35255327,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["haskell","json","json-parser","parser","pretty-printer","rfc8259"],"created_at":"2026-07-08T06:30:36.855Z","updated_at":"2026-07-08T06:30:37.736Z","avatar_url":"https://github.com/dwayne.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JSON Parser\n\nA JSON parser compliant with [RFC 8259](https://www.rfc-editor.org/info/rfc8259/).\n\nIt is tested against the [`nst/JSONTestSuite`](https://github.com/nst/JSONTestSuite) to ensure compliance with the RFC.\n\n## Usage\n\nThis package is distributed through its Git repository rather than Hackage. Add a `source-repository-package` stanza to your `cabal.project` to use it.\n\nIn `cabal.project`:\n\n```\nsource-repository-package\n  type: git\n  location: git@github.com:dwayne/hs-json-parser.git\n  [tag: \u003chash|tag|branch\u003e]\n```\n\n**N.B.** _Omitting the tag tracks the default branch and sacrifices reproducibility._\n\nIn `example.cabal`:\n\n```\nbuild-depends:\n  json-parser\n```\n\n## Parsing\n\n```haskell\n{-# LANGUAGE OverloadedStrings #-}\n\nimport qualified Json\n\nJson.parse \"null\"\n-- Right Null\n\nJson.parse \"false\"\n-- Right (Boolean False)\n\nJson.parse \"true\"\n-- Right (Boolean True)\n\nJson.parse \"1.2345e-67890\"\n-- Right (Number (Num { numSign = Plus, numDigits = \"1\", numFraction = Just \"2345\", numExponent = Just (Minus,\"67890\") }))\n\nJson.parse \"\\\"Hask\\\\u0065ll\\\"\"\n-- Right (String \"Haskell\")\n\nJson.parse \"[true, false, true]\"\n-- Right (Array [ Boolean True, Boolean False, Boolean True ])\n\nJson.parse \"{\\\"name\\\": \\\"Douglas\\\", \\\"age\\\": 71, \\\"email\\\": null}\"\n-- Right\n--   (Object\n--     [ ( \"name\", String \"Douglas\" )\n--     , ( \"age\", Number (Num { numSign = Plus, numDigits = \"71\", numFraction = Nothing, numExponent = Nothing }) )\n--     , ( \"email\", Null )\n--     ]\n--   )\n```\n\n## Printing\n\n```haskell\n{-# LANGUAGE OverloadedStrings #-}\n\nimport qualified Data.Text.IO as TIO\nimport qualified Json\n\nimport Json (Json(..))\n\nTIO.putStrLn $ Json.compact\n  (Object\n    [ ( \"name\", String \"Douglas\" )\n    , ( \"age\", Number (Json.numFromInt 71) )\n    , ( \"email\", Null )\n    ]\n  )\n-- {\"name\":\"Douglas\",\"age\":71,\"email\":null}\n\nTIO.putStrLn $ Json.pretty 4\n  (Object\n    [ ( \"name\", String \"Douglas\" )\n    , ( \"age\", Number (Json.numFromInt 71) )\n    , ( \"email\", Null )\n    ]\n  )\n-- {\n--     \"name\": \"Douglas\",\n--     \"age\": 71,\n--     \"email\": null\n-- }\n```\n\n## Public API\n\n```haskell\ndata Json\n  = Null\n  | Boolean Bool\n  | Number Number\n  | String Text\n  | Array Array\n  | Object Object\n  deriving (Eq, Show)\n\ndata Number\n\ninstance Eq Number\ninstance Show Number\n\ndata Sign\n  = Plus\n  | Minus\n  deriving (Eq, Show)\n\ntype Array = [Json]\n\ntype Object = [(Text, Json)]\n\ndata Error\n  = EncodingError UnicodeException\n  | SyntaxError SyntaxError\n  deriving (Eq, Show)\n\ntype SyntaxError = ParseErrorBundle Text Void\n\n-- Number: Construct\n\nnumFromInt :: Int -\u003e Number\nnumFromInteger :: Integer -\u003e Number\nnumFromFloat :: Float -\u003e Number\nnumFromDouble :: Double -\u003e Number\nnumFromCoefficientAndExponent :: Integer -\u003e Int -\u003e Number\n\n-- Number: Query\n\nnumSign :: Number -\u003e Sign\nnumDigits :: Number -\u003e Text\nnumFraction :: Number -\u003e Maybe Text\nnumExponent :: Number -\u003e Maybe (Sign, Text)\n\n-- Number: Convert\n\nnumToText :: Number -\u003e Text\nnumToRational :: Number -\u003e Rational\n\n-- Parser\n\nparse :: Text -\u003e Either SyntaxError Json\nparseFromFile :: FilePath -\u003e IO (Either Error Json)\n\n-- Printer\n\ncompact :: Json -\u003e Text\npretty :: Int -\u003e Json -\u003e Text\n\n-- Printer: Write\n\nwriteCompact :: FilePath -\u003e Json -\u003e IO ()\nwritePretty :: FilePath -\u003e Int -\u003e Json -\u003e IO ()\n```\n\n- [`UnicodeException`](https://hackage-content.haskell.org/package/text-2.1.4/docs/Data-Text-Encoding-Error.html#t:UnicodeException)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwayne%2Fhs-json-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdwayne%2Fhs-json-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwayne%2Fhs-json-parser/lists"}