{"id":13413716,"url":"https://github.com/bhmj/jsonslice","last_synced_at":"2026-01-28T14:12:32.510Z","repository":{"id":32170596,"uuid":"131777684","full_name":"bhmj/jsonslice","owner":"bhmj","description":"json slicer","archived":false,"fork":false,"pushed_at":"2024-08-12T09:09:44.000Z","size":5677,"stargazers_count":85,"open_issues_count":4,"forks_count":9,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-08-12T20:20:45.058Z","etag":null,"topics":["golang","jsonpath","jsonslice","slice"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bhmj.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}},"created_at":"2018-05-02T00:33:15.000Z","updated_at":"2024-08-12T09:09:47.000Z","dependencies_parsed_at":"2024-08-11T19:51:44.702Z","dependency_job_id":"6d0bd4a7-8c7b-432a-b1b4-7c3d050797bb","html_url":"https://github.com/bhmj/jsonslice","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/bhmj/jsonslice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhmj%2Fjsonslice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhmj%2Fjsonslice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhmj%2Fjsonslice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhmj%2Fjsonslice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bhmj","download_url":"https://codeload.github.com/bhmj/jsonslice/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhmj%2Fjsonslice/sbom","scorecard":{"id":236596,"data":{"date":"2025-08-11","repo":{"name":"github.com/bhmj/jsonslice","commit":"73827306cbbd890e1394ce67560752d4585f6647"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/23 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 12 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T05:53:46.915Z","repository_id":32170596,"created_at":"2025-08-17T05:53:46.915Z","updated_at":"2025-08-17T05:53:46.915Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28846058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T13:02:32.985Z","status":"ssl_error","status_checked_at":"2026-01-28T13:02:04.945Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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","jsonslice","slice"],"created_at":"2024-07-30T20:01:47.262Z","updated_at":"2026-01-28T14:12:32.493Z","avatar_url":"https://github.com/bhmj.png","language":"Go","readme":"[![Build Status](https://travis-ci.org/bhmj/jsonslice.svg?branch=master)](https://travis-ci.org/bhmj/jsonslice)\n[![Go Report Card](https://goreportcard.com/badge/github.com/bhmj/jsonslice)](https://goreportcard.com/report/github.com/bhmj/jsonslice)\n[![GoDoc](https://godoc.org/github.com/bhmj/jsonslice?status.svg)](https://godoc.org/github.com/bhmj/jsonslice)\n\n# JSON Slice\n\n## What is it?\n\nJSON Slice is a Go package which allows to execute fast jsonpath queries without unmarshalling the whole data.  \n\nSometimes you need to get a single value from incoming json using jsonpath, for example to route data accordingly or so. To do that you must unmarshall the whole data into interface{} struct and then apply some jsonpath library to it, only to get just a tiny little value. What a waste of resourses! Well, now there's `jsonslice`.\n\nSimply call `jsonslice.Get` on your raw json data to slice out just the part you need. The `[]byte` received can then be unmarshalled into a struct or used as it is.\n\n## Getting started\n\n#### 1. install\n\n```\n$ go get github.com/bhmj/jsonslice\n```\n\n#### 2. use it\n\n```golang\nimport \"github.com/bhmj/jsonslice\"\nimport \"fmt\"\n\nfunc main() {\n    var data = []byte(`\n    { \"sku\": [ \n        { \"id\": 1, \"name\": \"Bicycle\", \"price\": 160, \"extras\": [ \"flashlight\", \"pump\" ] },\n        { \"id\": 2, \"name\": \"Scooter\", \"price\": 280, \"extras\": [ \"helmet\", \"gloves\", \"spare wheel\" ] }\n      ]\n    } `)\n\n    a, _ := jsonslice.Get(data, \"$.sku[0].price\")\n    b, _ := jsonslice.Get(data, \"$.sku[1].extras.count()\")\n    c, _ := jsonslice.Get(data, \"$.sku[?(@.price \u003e 200)].name\")\n    d, _ := jsonslice.Get(data, \"$.sku[?(@.extras.count() \u003c 3)].name\")\n\n    fmt.Println(string(a)) // 160\n    fmt.Println(string(b)) // 3\n    fmt.Println(string(c)) // [\"Scooter\"]\n    fmt.Println(string(d)) // [\"Bicycle\"]\n}\n```\n[Run in Go Playground](https://play.golang.org/p/fYv-Y12akvs)\n\n## Package functions\n  \n`jsonslice.Get(data []byte, jsonpath string) ([]byte, error)`  \n  - get a slice from raw json data specified by jsonpath\n\n## Specs and references\n\n* Originally based on [Stefan Gössner's article](http://goessner.net/articles/JsonPath/index.html#e2).\n* Expression evaluator designed to comply with [ECMAScript Language: Expressions reference](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html).\n* A proud member of amazing [Christoph Burgmer's json-path-comparison](https://github.com/cburgmer/json-path-comparison).\n\n## Syntax features\n\n1. Classic dot notation (`$.simple_key`) is limited to alphanumeric characters. For more complex cases use `$['complex key!']` or `$.'complex key!'`. \n\n2. A single index reference returns an element, not an array; a slice reference always returns array:  \n```\n$ echo '[{\"name\":\"abc\"}, {\"name\":\"def\"}]' | ./build/jsonslice '$[0].name' \n\"abc\"\n```\n```\n$ echo '[{\"name\":\"abc\"}, {\"name\":\"def\"}]' | .build//jsonslice '$[0:1].name'\n[\"abc\"]\n```\n\n3. Indexing or slicing on root node is supported (assuming json is an array and not an object):  \n```\n$ cat example/sample1.json | ./build/jsonslice '$[0].author'\n```\n\n## Expressions\n\n### Overview \n```\n  $                   -- root node (can be either object or array)\n  $.node              -- dot-notated child\n  $.node.deeper       -- dot-notated child (chain of them)\n  $.'some node'       -- dot-notated child (syntax extension)\n  ['node']            -- bracket-notated child\n  ['foo','bar']       -- bracket-notated children (aggregation)\n  [5]                 -- array index\n  [-5]                -- negative index means \"from the end\"\n  [1:9]               -- array slice\n  [1:9:2]             -- array slice (+step)\n  .*  .[*]  .[:]      -- wildcard\n  ..key               -- deepscan\n  .'\\''               -- escape sequences supported (\\\", \\', \\n, \\r, \\t, \\0, \\\\)\n  .'\\x0A'            -- escaped hex bytes supported\n  .'\\u00F6'          -- escaped 16-bit unicode codepoints supported\n  .'\\U000000F6'      -- escaped 32-bit unicode codepoints supported\n```\n### Functions\n```\n  $.obj.length()      -- number of elements in an array or string length, depending on the obj type\n  $.obj.count()       -- same as above\n  $.val.size()        -- value size in bytes (as is)\n```\n### Slices\n```\n  $.arr[start:end:step]\n  $.arr[start:end]\n```\nSelects elements from `start` (inclusive) to `end` (exclusive), stepping by `step`. If `step` is omitted or zero, then 1 is implied. Out-of-bounds values are reduced to the nearest bound.\n\nIf `step` is positive:\n  - empty `start` treated as the first element inclusive\n  - empty `end` treated as the last element inclusive\n  - `start` should be less then `end`, otherwise result will be empty\n\nIf `step` is negative:\n  - empty `start` treated as last element inclusive\n  - empty `end` treated as the first element inclusive\n  - `start` should be greater then `end`, otherwise result will be empty\n\n### Filters\n\n```\n  [?(\u003cexpression\u003e)]  -- filter expression. Applicable to arrays only\n  @                  -- the root of the current element of the array. Used only within a filter.\n  @.val              -- a field of the current element of the array.\n```\n\n#### Filter operators\n\n  Operator | Description\n  --- | ---\n  math  | `+` `-` `*` `/` `%` `**`\n  `===`  | Strict equality (mimics JavaScript). Examples: `true===true, 42===42`\n  `==`  | Abstract equality (mimics JavaScript). Examples: `true==\"1\", 42==\"42\"`. \u003cbr\u003eUse single or double quotes for string expressions.\u003cbr\u003e`[?(@.color=='red')]` or `[?(@.color==\"red\")]`\n  `!=`  | Abstract not equal to\u003cbr\u003e`[?(@.author != \"Herman Melville\")]`\n  `!==`  | Strict not equal to\u003cbr\u003e`?(@.tag !== \"1\")`\n  `\u003e`   | Greater than\u003cbr\u003e`[?(@.price \u003e 10)]`\n  `\u003e=`  | Greater than or equal to\n  `\u003c`   | Less than\n  `\u003c=`  | Less than or equal to\n  `=~`  | Match a regexp\u003cbr\u003e`[?(@.name =~ /sword.*/i]`\n  `!~` or `!=~`  | Don't match a regexp\u003cbr\u003e`[?(@.name !~ /sword.*/i]`\n  `\u0026\u0026`  | Logical AND\u003cbr\u003e`[?(@.price \u003c 10 \u0026\u0026 @isbn)]`\n  `\\|\\|`  | Logical OR\u003cbr\u003e`[?(@.price \u003e 10 \\|\\| @.category == 'reference')]`\n  `!`  | Logical NOT\u003cbr\u003e`[?(!@.is_expensive)]`\n  `\\|`  | Bitwise OR\u003cbr\u003e`[?(@.bits\\|@.pieces \u003e 0)]`\n  `\u0026`  | Bitwise AND\u003cbr\u003e`[?(@.bits \u0026 7 == 1)]`\n  `^`  | Bitwise XOR\u003cbr\u003e`[?(@.bits ^ 1 \u003e 0)]`\n  `~`  | Bitwise NOT\u003cbr\u003e`[?(~@.bits == 0xF0)]`\n  `\u003c\u003c`  | Bitwise left shift\u003cbr\u003e`[?(@.bits \u003c\u003c 1 == 2)]`\n  `\u003e\u003e`  | Bitwise right shift\u003cbr\u003e`[?(@.bits \u003e\u003e 1 == 0)]`\n\n#### Comparison details\nComparison mostly complies with JavaScript specifications, see [Testing and Comparison Operations](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-testing-and-comparison-operations).   \nIf you encounter wrong or inconsistent comparison behaviour please let me know by creating an issue in this repository.\n\n## Examples\n\nAssuming `sample0.json` and `sample1.json` in the example directory:  \n\n  `cat example/sample0.json | ./build/jsonslice '$.store.book[0]'`  \n  `cat example/sample0.json | ./build/jsonslice '$.store.book[0].title'`  \n  `cat example/sample0.json | ./build/jsonslice '$.store.book[0:-1]'`  \n  `cat example/sample1.json | ./build/jsonslice '$[1].author'`  \n  `cat example/sample0.json | ./build/jsonslice '$.store.book[?(@.price \u003e 10)]'`  \n  `cat example/sample0.json | ./build/jsonslice '$.store.book[?(@.price \u003e $.expensive)]'`  \n\nMuch more examples can be found in `jsonslice_test.go`  \n\n## Benchmarks (Core i9-9880H)\n\n```diff\n$ go test -bench=. -benchmem -benchtime=4s\ngoos: darwin\ngoarch: amd64\npkg: github.com/bhmj/jsonslice\ncpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz\n++ standard json.Unmarshal (for reference):\nBenchmark_Unmarshal-16                    398998      11268 ns/op   4272 B/op   130 allocs/op\n++ and here's a jsonslice.Get:\nBenchmark_Jsonslice_Get_Simple-16        1660604       2885 ns/op     24 B/op     1 allocs/op\n++ parsing is the first part of jsonslicing, here it is separately:\nBenchmark_JsonSlice_ParsePath-16        11955015        400 ns/op      0 B/op     0 allocs/op\n++ aggregating non-contiguous elements may take a bit longer (extra mallocs involved):\nBenchmark_Jsonslice_Get_Aggregated-16    1000000       4335 ns/op    313 B/op    10 allocs/op\n++ standard json.Unmarshal of a large json (10 Mb):\nBenchmark_Unmarshal_10Mb-16                  100   40787414 ns/op    224 B/op     5 allocs/op\n++ jsonslicing the same json, target element is at the start:\nBenchmark_Jsonslice_Get_10Mb_First-16    3459492       1370 ns/op     24 B/op     1 allocs/op\n++ jsonslicing the same json, target element is at the end: still beats Unmarshal\nBenchmark_Jsonslice_Get_10Mb_Last-16         133   35731931 ns/op     54 B/op     1 allocs/op\nPASS\nok      github.com/bhmj/jsonslice       52.452s\n```\n\n## Changelog\n\n**1.1.3** (2024-07-29) -- bugfix: space after closing `}` of a target object.\n\n**1.1.2** (2022-01-02) -- Unicode support added. Expression parser upgrade to v0.9.1  \nBugfix: indexing of array element inside expression (`@[2]`).  \nBugfix: ecaped backslash in node key now works (`$.[\"\\\\\"]`).  \nSee `Test_Fixes` function for bugfix details.\n\n**1.1.1** (2021-10-20) -- Expression parser upgrade to v0.9.0\n\n**1.1.0** (2021-11-12) -- Expression parser/evaluator has been separated to [different project](https://github.com/bhmj/xpression/) and completely rewritten. Parentheses now fully supported. Exponentiation operator added (`**`). Bitwise operators added (`|`, `\u0026`, `^`, `\u003c\u003c`, `\u003e\u003e`). All expression calculations are JavaScript-compliant.\n\n**1.0.6** (2021-10-31) -- JS-like behaviour on string/number/boolean values comparison. `===` operator added for strict comparison. Strings are now comparable.\n\n**1.0.5** (2020-09-22) -- bugfix: `$..many.keys` used to trigger on `many` without recursing deeper on `keys`.\n\n**1.0.4** (2020-05-07) -- bugfix: `$*` path generated panic.\n\n**1.0.3** (2019-12-24) -- bugfix: `$[0].foo` `[{\"foo\":\"\\\\\"}]` generated \"unexpected end of input\".\n\n**1.0.2** (2019-12-07) -- nested aggregation (`$[:].['a','b']`) now works as expected. TODO: add option to switch nested aggregation mode at runtime!\n\n**1.0.1** (2019-12-01) -- \"not equal\" regexp operator added (`!=~` or `!~`).\n\n**1.0.0** (2019-11-29) -- deepscan operator (`..`) added, slice with step `$[1:9:2]` is now supported, syntax extensions added. `GetArrayElements()` removed.\n\n**0.7.6** (2019-09-11) -- bugfix: escaped backslash at the end of a string value.\n\n**0.7.5** (2019-05-21) -- Functions `count()`, `size()`, `length()` work in filters.\n\u003e `$.store.bicycle.equipment[?(@.count() == 2)]` -\u003e `[[\"light saber\", \"apparel\"]]`  \n\n**0.7.4** (2019-03-01) -- Mallocs reduced (see Benchmarks section).\n\n**0.7.3** (2019-02-27) -- `GetArrayElements()` added.\n\n**0.7.2** (2018-12-25) -- bugfix: closing square bracket inside a string value.\n\n**0.7.1** (2018-10-16) -- bracket notation is now supported.\n\u003e `$.store.book[:]['price','title']` -\u003e `[[8.95,\"Sayings of the Century\"],[12.99,\"Sword of Honour\"],[8.99,\"Moby Dick\"],[22.99,\"The Lord of the Rings\"]]`\n\n**0.7.0** (2018-07-23) -- Wildcard key (`*`) added.\n\u003e `$.store.book[-1].*` -\u003e `[\"fiction\",\"J. R. R. Tolkien\",\"The Lord of the Rings\",\"0-395-19395-8\",22.99]`  \n\u003e `$.store.*[:].price` -\u003e `[8.95,12.99,8.99,22.99]`\n\n**0.6.3** (2018-07-16) -- Boolean/null value error fixed.\n\n**0.6.2** (2018-07-03) -- More tests added, error handling clarified.\n\n**0.6.1** (2018-06-26) -- Nested array indexing is now supported.\n\u003e `$.store.bicycle.equipment[1][0]` -\u003e `\"peg leg\"`\n\n**0.6.0** (2018-06-25) -- Regular expressions added.\n\u003e `$.store.book[?(@.title =~ /(dick)|(lord)/i)].title` -\u003e `[\"Moby Dick\",\"The Lord of the Rings\"]`\n\n**0.5.1** (2018-06-15) -- Logical expressions added.\n\u003e `$.store.book[?(@.price \u003e $.expensive \u0026\u0026 @.isbn)].title` -\u003e `[\"The Lord of the Rings\"]`\n\n**0.5.0** (2018-06-14) -- Expressions (aka filters) added.\n\u003e `$.store.book[?(@.price \u003e $.expensive)].title` -\u003e `[\"Sword of Honour\",\"The Lord of the Rings\"]`\n\n**0.4.0** (2018-05-16) -- Aggregating sub-queries added.\n\u003e `$.store.book[1:3].author` -\u003e `[\"John\",\"William\"]`\n\n**0.3.0** (2018-05-05) -- MVP.\n\n## Roadmap\n\n- [x] length(), count(), size() functions\n- [x] filters: simple expressions\n- [x] filters: complex expressions (with logical operators)\n- [x] nested arrays support\n- [x] wildcard operator (`*`)\n- [x] bracket notation for multiple field queries (`$['a','b']`)\n- [x] deepscan operator (`..`)\n- [x] syntax extensions: `$.'keys with spaces'.price`\n- [x] flexible syntax: `$[0]` works on both `[1,2,3]` and `{\"0\":\"abc\"}`\n- [x] JavaScript-compatible expressions\n- [x] Unicode support\n- [ ] IN (), NOT IN ()\n- [ ] cache parsed jsonpaths of used variables at filterMatch.varFunc(str)\n- [ ] Optionally unmarshal the result\n- [ ] Option to select aggregation mode (nested or plain)\n\n## Contributing\n\n1. Fork it!\n2. Create your feature branch: `git checkout -b my-new-feature`\n3. Commit your changes: `git commit -am 'Add some feature'`\n4. Push to the branch: `git push origin my-new-feature`\n5. Submit a pull request :)\n\n## Licence\n\n[MIT](http://opensource.org/licenses/MIT)\n\n## Author\n\nMichael Gurov aka BHMJ\n","funding_links":[],"categories":["查询语言","Query Language","Go语言包管理","Relational Databases"],"sub_categories":["HTTP客户端","HTTP Clients","查询语","交流"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbhmj%2Fjsonslice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbhmj%2Fjsonslice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbhmj%2Fjsonslice/lists"}