{"id":25122458,"url":"https://github.com/speakeasy-api/jsonpath","last_synced_at":"2026-02-28T02:43:34.980Z","repository":{"id":271460193,"uuid":"798228775","full_name":"speakeasy-api/jsonpath","owner":"speakeasy-api","description":"This is a full implementation of RFC 9535 built to be WASM compatible and powers https://overlay.speakeasy.com/","archived":false,"fork":false,"pushed_at":"2026-02-11T11:00:19.000Z","size":12004,"stargazers_count":19,"open_issues_count":2,"forks_count":8,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-11T19:19:38.649Z","etag":null,"topics":["golang","jsonpath","openapi","overlay","rfc-9535","wasm"],"latest_commit_sha":null,"homepage":"https://overlay.speakeasy.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/speakeasy-api.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":"2024-05-09T11:00:22.000Z","updated_at":"2026-02-11T10:59:48.000Z","dependencies_parsed_at":"2025-01-27T20:31:40.460Z","dependency_job_id":"ed72d5ea-a5b0-4b14-8f1e-cf6a73ba8fad","html_url":"https://github.com/speakeasy-api/jsonpath","commit_stats":null,"previous_names":["speakeasy-api/jsonpath"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/speakeasy-api/jsonpath","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/speakeasy-api%2Fjsonpath","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/speakeasy-api%2Fjsonpath/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/speakeasy-api%2Fjsonpath/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/speakeasy-api%2Fjsonpath/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/speakeasy-api","download_url":"https://codeload.github.com/speakeasy-api/jsonpath/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/speakeasy-api%2Fjsonpath/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29923426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"online","status_checked_at":"2026-02-28T02:00:07.010Z","response_time":90,"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":["golang","jsonpath","openapi","overlay","rfc-9535","wasm"],"created_at":"2025-02-08T07:13:34.871Z","updated_at":"2026-02-28T02:43:34.945Z","avatar_url":"https://github.com/speakeasy-api.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n \u003ca href=\"https://www.speakeasy.com/\" target=\"_blank\"\u003e\n   \u003cpicture\u003e\n       \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/21dd5d3a-aefc-4cd3-abee-5e17ef1d4dad\"\u003e\n       \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/0a747f98-d228-462d-9964-fd87bf93adc5\"\u003e\n       \u003cimg width=\"100px\" src=\"https://github.com/user-attachments/assets/21dd5d3a-aefc-4cd3-abee-5e17ef1d4dad#gh-light-mode-only\" alt=\"Speakeasy\"\u003e\n   \u003c/picture\u003e\n \u003c/a\u003e\n  \u003ch1\u003eSpeakeasy\u003c/h1\u003e\n  \u003cp\u003eBuild APIs your users love ❤️ with Speakeasy\u003c/p\u003e\n  \u003cdiv\u003e\n   \u003ca href=\"https://speakeasy.com/docs/create-client-sdks/\" target=\"_blank\"\u003e\u003cb\u003eDocs Quickstart\u003c/b\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;//\u0026nbsp;\u0026nbsp;\u003ca href=\"https://join.slack.com/t/speakeasy-dev/shared_invite/zt-1cwb3flxz-lS5SyZxAsF_3NOq5xc8Cjw\" target=\"_blank\"\u003e\u003cb\u003eJoin us on Slack\u003c/b\u003e\u003c/a\u003e\n  \u003c/div\u003e\n \u003cbr /\u003e\n\n\u003c/div\u003e\n\n# jsonpath\n\n\u003ca href=\"https://pkg.go.dev/github.com/speakeasy-api/jsonpath?tab=doc\"\u003e\u003cimg alt=\"Go Doc\" src=\"https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge\"\u003e\u003c/a\u003e\n\nThis is a full implementation of [RFC 9535](https://datatracker.ietf.org/doc/rfc9535/)\n\nIt is build to be wasm compatible. A playground application is available at [overlay.speakeasy.com](https://overlay.speakeasy.com/)\n\nEverything within RFC9535 is in scope. Grammars outside RFC 9535 are not in scope.\n\n## Installation\n\nThis application is included in the [speakeasy](https://github.com/speakeasy-api/speakeasy) CLI, but is also available as a standalone library.\n\n## ABNF grammar\n\n```\n   jsonpath-query      = root-identifier segments\n   segments            = *(S segment)\n\n   B                   = %x20 /    ; Space\n                         %x09 /    ; Horizontal tab\n                         %x0A /    ; Line feed or New line\n                         %x0D      ; Carriage return\n   S                   = *B        ; optional blank space\n   root-identifier     = \"$\"\n   selector            = name-selector /\n                         wildcard-selector /\n                         slice-selector /\n                         index-selector /\n                         filter-selector\n   name-selector       = string-literal\n\n   string-literal      = %x22 *double-quoted %x22 /     ; \"string\"\n                         %x27 *single-quoted %x27       ; 'string'\n\n   double-quoted       = unescaped /\n                         %x27      /                    ; '\n                         ESC %x22  /                    ; \\\"\n                         ESC escapable\n\n   single-quoted       = unescaped /\n                         %x22      /                    ; \"\n                         ESC %x27  /                    ; \\'\n                         ESC escapable\n\n   ESC                 = %x5C                           ; \\ backslash\n\n   unescaped           = %x20-21 /                      ; see RFC 8259\n                            ; omit 0x22 \"\n                         %x23-26 /\n                            ; omit 0x27 '\n                         %x28-5B /\n                            ; omit 0x5C \\\n                         %x5D-D7FF /\n                            ; skip surrogate code points\n                         %xE000-10FFFF\n\n   escapable           = %x62 / ; b BS backspace U+0008\n                         %x66 / ; f FF form feed U+000C\n                         %x6E / ; n LF line feed U+000A\n                         %x72 / ; r CR carriage return U+000D\n                         %x74 / ; t HT horizontal tab U+0009\n                         \"/\"  / ; / slash (solidus) U+002F\n                         \"\\\"  / ; \\ backslash (reverse solidus) U+005C\n                         (%x75 hexchar) ;  uXXXX U+XXXX\n\n   hexchar             = non-surrogate /\n                         (high-surrogate \"\\\" %x75 low-surrogate)\n   non-surrogate       = ((DIGIT / \"A\"/\"B\"/\"C\" / \"E\"/\"F\") 3HEXDIG) /\n                         (\"D\" %x30-37 2HEXDIG )\n   high-surrogate      = \"D\" (\"8\"/\"9\"/\"A\"/\"B\") 2HEXDIG\n   low-surrogate       = \"D\" (\"C\"/\"D\"/\"E\"/\"F\") 2HEXDIG\n\n   HEXDIG              = DIGIT / \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n   wildcard-selector   = \"*\"\n   index-selector      = int                        ; decimal integer\n\n   int                 = \"0\" /\n                         ([\"-\"] DIGIT1 *DIGIT)      ; - optional\n   DIGIT1              = %x31-39                    ; 1-9 non-zero digit\n   slice-selector      = [start S] \":\" S [end S] [\":\" [S step ]]\n\n   start               = int       ; included in selection\n   end                 = int       ; not included in selection\n   step                = int       ; default: 1\n   filter-selector     = \"?\" S logical-expr\n   logical-expr        = logical-or-expr\n   logical-or-expr     = logical-and-expr *(S \"||\" S logical-and-expr)\n                           ; disjunction\n                           ; binds less tightly than conjunction\n   logical-and-expr    = basic-expr *(S \"\u0026\u0026\" S basic-expr)\n                           ; conjunction\n                           ; binds more tightly than disjunction\n\n   basic-expr          = paren-expr /\n                         comparison-expr /\n                         test-expr\n\n   paren-expr          = [logical-not-op S] \"(\" S logical-expr S \")\"\n                                           ; parenthesized expression\n   logical-not-op      = \"!\"               ; logical NOT operator\n   test-expr           = [logical-not-op S]\n                         (filter-query / ; existence/non-existence\n                          function-expr) ; LogicalType or NodesType\n   filter-query        = rel-query / jsonpath-query\n   rel-query           = current-node-identifier segments\n   current-node-identifier = \"@\"\n   comparison-expr     = comparable S comparison-op S comparable\n   literal             = number / string-literal /\n                         true / false / null\n   comparable          = literal /\n                         singular-query / ; singular query value\n                         function-expr    ; ValueType\n   comparison-op       = \"==\" / \"!=\" /\n                         \"\u003c=\" / \"\u003e=\" /\n                         \"\u003c\"  / \"\u003e\"\n\n   singular-query      = rel-singular-query / abs-singular-query\n   rel-singular-query  = current-node-identifier singular-query-segments\n   abs-singular-query  = root-identifier singular-query-segments\n   singular-query-segments = *(S (name-segment / index-segment))\n   name-segment        = (\"[\" name-selector \"]\") /\n                         (\".\" member-name-shorthand)\n   index-segment       = \"[\" index-selector \"]\"\n   number              = (int / \"-0\") [ frac ] [ exp ] ; decimal number\n   frac                = \".\" 1*DIGIT                  ; decimal fraction\n   exp                 = \"e\" [ \"-\" / \"+\" ] 1*DIGIT    ; decimal exponent\n   true                = %x74.72.75.65                ; true\n   false               = %x66.61.6c.73.65             ; false\n   null                = %x6e.75.6c.6c                ; null\n   function-name       = function-name-first *function-name-char\n   function-name-first = LCALPHA\n   function-name-char  = function-name-first / \"_\" / DIGIT\n   LCALPHA             = %x61-7A  ; \"a\"..\"z\"\n\n   function-expr       = function-name \"(\" S [function-argument\n                            *(S \",\" S function-argument)] S \")\"\n   function-argument   = literal /\n                         filter-query / ; (includes singular-query)\n                         logical-expr /\n                         function-expr\n   segment             = child-segment / descendant-segment\n   child-segment       = bracketed-selection /\n                         (\".\"\n                          (wildcard-selector /\n                           member-name-shorthand))\n\n   bracketed-selection = \"[\" S selector *(S \",\" S selector) S \"]\"\n\n   member-name-shorthand = name-first *name-char\n   name-first          = ALPHA /\n                         \"_\"   /\n                         %x80-D7FF /\n                            ; skip surrogate code points\n                         %xE000-10FFFF\n   name-char           = name-first / DIGIT\n\n   DIGIT               = %x30-39              ; 0-9\n   ALPHA               = %x41-5A / %x61-7A    ; A-Z / a-z\n   descendant-segment  = \"..\" (bracketed-selection /\n                               wildcard-selector /\n                               member-name-shorthand)\n\n                Figure 2: Collected ABNF of JSONPath Queries\n\n   Figure 3 contains the collected ABNF grammar that defines the syntax\n   of a JSONPath Normalized Path while also using the rules root-\n   identifier, ESC, DIGIT, and DIGIT1 from Figure 2.\n\n   normalized-path      = root-identifier *(normal-index-segment)\n   normal-index-segment = \"[\" normal-selector \"]\"\n   normal-selector      = normal-name-selector / normal-index-selector\n   normal-name-selector = %x27 *normal-single-quoted %x27 ; 'string'\n   normal-single-quoted = normal-unescaped /\n                          ESC normal-escapable\n   normal-unescaped     =    ; omit %x0-1F control codes\n                          %x20-26 /\n                             ; omit 0x27 '\n                          %x28-5B /\n                             ; omit 0x5C \\\n                          %x5D-D7FF /\n                             ; skip surrogate code points\n                          %xE000-10FFFF\n\n   normal-escapable     = %x62 / ; b BS backspace U+0008\n                          %x66 / ; f FF form feed U+000C\n                          %x6E / ; n LF line feed U+000A\n                          %x72 / ; r CR carriage return U+000D\n                          %x74 / ; t HT horizontal tab U+0009\n                          \"'\" /  ; ' apostrophe U+0027\n                          \"\\\" /  ; \\ backslash (reverse solidus) U+005C\n                          (%x75 normal-hexchar)\n                                          ; certain values u00xx U+00XX\n   normal-hexchar       = \"0\" \"0\"\n                          (\n                             (\"0\" %x30-37) / ; \"00\"-\"07\"\n                                ; omit U+0008-U+000A BS HT LF\n                             (\"0\" %x62) /    ; \"0b\"\n                                ; omit U+000C-U+000D FF CR\n                             (\"0\" %x65-66) / ; \"0e\"-\"0f\"\n                             (\"1\" normal-HEXDIG)\n                          )\n   normal-HEXDIG        = DIGIT / %x61-66    ; \"0\"-\"9\", \"a\"-\"f\"\n   normal-index-selector = \"0\" / (DIGIT1 *DIGIT)\n                           ; non-negative decimal integer\n```\n\n## Contributing\n\nWe welcome contributions to this repository! Please open a Github issue or a Pull Request if you have an implementation for a bug fix or feature. This repository is compliant with the [jsonpath standard compliance test suite](https://github.com/jsonpath-standard/jsonpath-compliance-test-suite/tree/9277705cda4489c3d0d984831e7656e48145399b) \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspeakeasy-api%2Fjsonpath","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspeakeasy-api%2Fjsonpath","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspeakeasy-api%2Fjsonpath/lists"}