{"id":37027608,"url":"https://github.com/transportial/gsjson","last_synced_at":"2026-01-14T03:17:08.540Z","repository":{"id":236167180,"uuid":"792057995","full_name":"Transportial/GSJson","owner":"Transportial","description":"GSJson is a getter/setter syntax interpretation language","archived":false,"fork":false,"pushed_at":"2025-09-04T14:04:09.000Z","size":143,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-04T16:08:55.905Z","etag":null,"topics":["json","mapping","mapping-languages"],"latest_commit_sha":null,"homepage":"https://transportial.com","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Transportial.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-04-25T22:31:40.000Z","updated_at":"2025-09-04T14:04:13.000Z","dependencies_parsed_at":"2025-08-07T07:03:06.655Z","dependency_job_id":"49ec3309-f1cc-408e-a069-90544053acae","html_url":"https://github.com/Transportial/GSJson","commit_stats":null,"previous_names":["transportial/gsjson"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/Transportial/GSJson","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Transportial%2FGSJson","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Transportial%2FGSJson/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Transportial%2FGSJson/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Transportial%2FGSJson/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Transportial","download_url":"https://codeload.github.com/Transportial/GSJson/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Transportial%2FGSJson/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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":["json","mapping","mapping-languages"],"created_at":"2026-01-14T03:17:07.878Z","updated_at":"2026-01-14T03:17:08.535Z","avatar_url":"https://github.com/Transportial.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GSJson\nJSON `Getter` and `Setter` language inspired by [GJSON](https://github.com/tidwall/gjson). It provides a fast and simple way to get values from JSON documents with powerful path syntax and built-in modifiers.\n\n## Installation\nInstall using Maven or Gradle. Replace `LATEST_VERSION` with the actual latest version. \n\n**Maven:**\n``` xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.transportial\u003c/groupId\u003e\n    \u003cartifactId\u003egsjson\u003c/artifactId\u003e\n    \u003cversion\u003eLATEST_VERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n**Gradle:**\n```groovy\ndependencies {\n    implementation 'com.transportial:gsjson:LATEST_VERSION'\n}\n```\n\n## Features \n\n- **Multiple Data Type Support**: Works with `String`, `org.json.JSONObject`, `org.json.JSONArray`, and Jackson `JsonNode`\n- **Dot Notation Paths**: Select JSON values using intuitive dot notation syntax\n- **Wildcard Support**: Use `*` and `?` wildcards for key matching\n- **Array Operations**: Access array elements, get length, and extract child paths\n- **Advanced Filtering**: Support for `==`, `!=`, `\u003c`, `\u003c=`, `\u003e`, `\u003e=`, `%` (like), `!%` (not like) operators\n- **Nested Array Queries**: Complex filtering with nested conditions\n- **Built-in Modifiers**: Transform data with modifiers like `@reverse`, `@sort`, `@sum`, `@avg`, `@join`, etc.\n- **Path Chaining**: Chain operations using the pipe `|` character\n- **JSON Lines Support**: Process newline-delimited JSON with `..` prefix\n- **Enhanced Result Type**: Rich result objects with utility methods\n- **Reducer Functions**: Aggregate array data with mathematical and string operations\n\n## Path Syntax\n\nA path is a series of keys separated by dots. GSJSON supports the following path features:\n\n- **Basic Access**: `name.first` - Access nested properties\n- **Array Index**: `developers.[0]` - Access array elements by index\n- **Array Length**: `developers.[#]` - Get array length\n- **All Elements**: `developers.[#.firstName]` - Get all firstName values from array\n- **Wildcards**: `*.name` or `test?` - Match keys with wildcards\n- **Filtering**: `developers.[age \u003e \"25\"]` - Filter arrays by conditions\n- **Escaping**: `fav\\.movie` - Escape special characters\n\n## Examples\n\nFor the following examples, consider this JSON:\n\n```json\n{\n  \"name\": {\"first\": \"Tom\", \"last\": \"Anderson\"},\n  \"age\": 37,\n  \"children\": [\"Sara\", \"Alex\", \"Jack\"],\n  \"fav.movie\": \"Deer Hunter\",\n  \"friends\": [\n    {\"first\": \"Dale\", \"last\": \"Murphy\", \"age\": 44, \"nets\": [\"ig\", \"fb\", \"tw\"]},\n    {\"first\": \"Roger\", \"last\": \"Craig\", \"age\": 68, \"nets\": [\"fb\", \"tw\"]},\n    {\"first\": \"Jane\", \"last\": \"Murphy\", \"age\": 47, \"nets\": [\"ig\", \"tw\"]},\n    {\"first\": \"David\", \"last\": \"Smith\", \"age\": 25, \"nets\": [\"fb\"]}\n  ]\n}\n```\n\n### Basic Selection\n\n```kotlin\n// Basic property access\nGSJson.get(json, \"age\")                    // Returns: 37\nGSJson.get(json, \"name.last\")              // Returns: \"Anderson\"\nGSJson.get(json, \"children\")               // Returns: [\"Sara\",\"Alex\",\"Jack\"]\n\n// Escaped property names\nGSJson.get(json, \"fav\\\\.movie\")            // Returns: \"Deer Hunter\"\n```\n\n### Array Operations\n\n```kotlin\n// Array indexing\nGSJson.get(json, \"children.[0]\")           // Returns: \"Sara\"\nGSJson.get(json, \"children.[1]\")           // Returns: \"Alex\"\n\n// Array length\nGSJson.get(json, \"children.[#]\")           // Returns: 3\nGSJson.get(json, \"friends.[#]\")            // Returns: 4\n\n// All child elements\nGSJson.get(json, \"friends.[#.first]\")      // Returns: [\"Dale\",\"Roger\",\"Jane\",\"David\"]\nGSJson.get(json, \"friends.[#.age]\")        // Returns: [44,68,47,25]\n```\n\n### Wildcards\n\n```kotlin\n// Wildcard matching\nGSJson.get(json, \"name.*\")                 // Returns: [\"Tom\",\"Anderson\"] \nGSJson.get(json, \"name.fir?t\")             // Returns: \"Tom\"\n```\n\n### Filtering\n\n```kotlin\n// Basic filtering\nGSJson.get(json, \"friends.[last == \\\"Murphy\\\"].first\")     // Returns: \"Dale\"\nGSJson.get(json, \"friends.[age \u003e \\\"45\\\"].[0].first\")       // Returns: \"Roger\"\nGSJson.get(json, \"friends.[age \u003c= \\\"30\\\"].[0].first\")      // Returns: \"David\"\n\n// Pattern matching\nGSJson.get(json, \"friends.[first % \\\"D*\\\"].last\")          // Returns: \"Murphy\" (Dale)\nGSJson.get(json, \"friends.[first !% \\\"D*\\\"].[0].first\")    // Returns: \"Roger\"\n\n// Nested array filtering\nGSJson.get(json, \"friends.[nets.[# == \\\"fb\\\"]].[#.first]\") // Returns: [\"Dale\",\"Roger\",\"David\"]\n```\n\n### Built-in Modifiers\n\n```kotlin\n// Array manipulation\nGSJson.get(json, \"children|@reverse\")      // Returns: [\"Jack\",\"Alex\",\"Sara\"]\nGSJson.get(json, \"children|@count\")        // Returns: 3\n\n// Object operations  \nGSJson.get(json, \"name|@keys\")             // Returns: [\"first\",\"last\"]\nGSJson.get(json, \"name|@values\")           // Returns: [\"Tom\",\"Anderson\"]\n\n// JSON formatting\nGSJson.get(json, \"name|@pretty\")           // Returns: prettified JSON\nGSJson.get(json, \"name|@ugly\")             // Returns: minified JSON\n```\n\n### Sorting Operations\n\n```kotlin\n// Basic array sorting\nGSJson.get(json, \"children|@sort\")         // Returns: [\"Alex\",\"Jack\",\"Sara\"]\nGSJson.get(json, \"children|@sort:desc\")    // Returns: [\"Sara\",\"Jack\",\"Alex\"]\n\n// Sort arrays by object property\nGSJson.get(json, \"friends|@sortBy:age\")    // Sort by age ascending\nGSJson.get(json, \"friends|@sortBy:age:desc\")     // Sort by age descending\nGSJson.get(json, \"friends|@sortBy:first\")        // Sort by first name\nGSJson.get(json, \"friends|@sortBy:last:desc\")    // Sort by last name descending\n\n// Chain sorting with other operations\nGSJson.get(json, \"friends.[age \u003e \\\"40\\\"]|@sortBy:age|[#.first]\")  // Filter, sort, then extract names\nGSJson.get(json, \"friends.[#.age]|@sort:desc|[0]\")               // Get highest age\n```\n\n### Reducer Operations\n\n```kotlin\n// Mathematical operations\nGSJson.get(json, \"friends.[#.age]|@sum\")   // Returns: 184.0\nGSJson.get(json, \"friends.[#.age]|@avg\")   // Returns: 46.0\nGSJson.get(json, \"friends.[#.age]|@min\")   // Returns: 25.0  \nGSJson.get(json, \"friends.[#.age]|@max\")   // Returns: 68.0\n\n// String operations\nGSJson.get(json, \"friends.[#.first]|@join\")        // Returns: \"Dale,Roger,Jane,David\"\nGSJson.get(json, \"friends.[#.first]|@join: | \")    // Returns: \"Dale | Roger | Jane | David\"\nGSJson.get(json, \"children|@join:-\")               // Returns: \"Sara-Alex-Jack\"\n```\n\n### Mathematical Operations\n\n```kotlin\nval numbers = \"[10, 20, 30, 40, 50]\"\n\n// Basic math operations on arrays\nGSJson.get(numbers, \".|@multiply:2\")    // Returns: [20.0, 40.0, 60.0, 80.0, 100.0]\nGSJson.get(numbers, \".|@add:5\")         // Returns: [15.0, 25.0, 35.0, 45.0, 55.0]\nGSJson.get(numbers, \".|@subtract:10\")   // Returns: [0.0, 10.0, 20.0, 30.0, 40.0]\nGSJson.get(numbers, \".|@divide:2\")      // Returns: [5.0, 10.0, 15.0, 20.0, 25.0]\n\n// Advanced math operations\nGSJson.get(numbers, \".|@abs\")           // Returns: absolute values\nGSJson.get(numbers, \".|@round:1\")       // Returns: rounded to 1 decimal place\nGSJson.get(numbers, \".|@power:2\")       // Returns: squared values\n\n// Chain mathematical operations with aggregation\nGSJson.get(json, \"friends.[#.age]|@add:5|@sum\")  // Add 5 to each age, then sum\n```\n\n### Dynamic Mathematical Operations\n\nMathematical operations now support both static values and JSON selectors as arguments:\n\n```kotlin\nval dynamicMathJson = \"\"\"\n{\n  \"numbers\": [10, 20, 30],\n  \"multiplier\": 3,\n  \"divisor\": 2,\n  \"addend\": 5,\n  \"config\": {\n    \"factor\": 4,\n    \"precision\": 1\n  }\n}\n\"\"\"\n\n// Dynamic operations using JSON selectors\nGSJson.get(dynamicMathJson, \"numbers|@multiply:multiplier\")      // Returns: [30.0, 60.0, 90.0]\nGSJson.get(dynamicMathJson, \"numbers|@divide:divisor\")           // Returns: [5.0, 10.0, 15.0]\nGSJson.get(dynamicMathJson, \"numbers|@add:addend\")               // Returns: [15.0, 25.0, 35.0]\nGSJson.get(dynamicMathJson, \"numbers|@subtract:addend\")          // Returns: [5.0, 15.0, 25.0]\nGSJson.get(dynamicMathJson, \"numbers|@power:divisor\")            // Returns: [100.0, 400.0, 900.0]\n\n// Nested path selectors\nGSJson.get(dynamicMathJson, \"numbers|@multiply:config.factor\")   // Returns: [40.0, 80.0, 120.0]\nGSJson.get(dynamicMathJson, \"numbers|@round:config.precision\")   // Returns: rounded values\n\n// Chain dynamic and static operations\nGSJson.get(dynamicMathJson, \"numbers|@add:addend|@multiply:2\")   // Add dynamic value, then multiply by 2\nGSJson.get(dynamicMathJson, \"numbers|@multiply:config.factor|@divide:divisor\")  // Dynamic multiply then dynamic divide\n```\n\n**Supported dynamic math operations:**\n- `@multiply:selector` / `@mul:selector` - Multiply by value from JSON selector\n- `@divide:selector` / `@div:selector` - Divide by value from JSON selector  \n- `@add:selector` / `@plus:selector` - Add value from JSON selector\n- `@subtract:selector` / `@sub:selector` - Subtract value from JSON selector\n- `@power:selector` / `@pow:selector` - Raise to power from JSON selector\n- `@round:selector` - Round to precision from JSON selector\n\n### Fallback Default Values\n\n```kotlin\n// Provide defaults for missing or null values\nGSJson.get(json, \"name.middle\", \"J\")              // Returns: \"J\" (field doesn't exist)\nGSJson.get(json, \"age\", 0)                        // Returns: 37 (field exists)\nGSJson.get(json, \"missing.field\", \"default\")      // Returns: \"default\"\nGSJson.get(json, \"friends.[99].name\", \"Unknown\")  // Returns: \"Unknown\" (index out of bounds)\n\n// Works with all data types\nGSJson.get(json, \"missing.number\", 42)            // Numeric default\nGSJson.get(json, \"missing.boolean\", true)         // Boolean default\nGSJson.get(json, \"missing.list\", listOf(\"a\", \"b\")) // List default\n```\n\n### Path Chainingpl\n\n```kotlin\n// Chain multiple operations\nGSJson.get(json, \"friends.[age \u003e \\\"40\\\"].[#.first]|@join\")  // Returns: \"Dale,Roger,Jane\"\nGSJson.get(json, \"children|@reverse|@join\")                 // Returns: \"Jack,Alex,Sara\"\nGSJson.get(json, \"friends.[#.age]|@reverse|@max\")          // Returns: 68.0\n```\n\n### JSON Lines\n\nProcess newline-delimited JSON:\n\n```kotlin\nval jsonLines = \"\"\"\n{\"name\": \"Alice\", \"age\": 30}\n{\"name\": \"Bob\", \"age\": 25}  \n{\"name\": \"Charlie\", \"age\": 35}\n\"\"\"\n\nGSJson.get(jsonLines, \"..#\")                    // Returns: 3\nGSJson.get(jsonLines, \"..[1].name\")             // Returns: \"Bob\"\nGSJson.get(jsonLines, \"..[#.name]|@join\")       // Returns: \"Alice,Bob,Charlie\"\nGSJson.get(jsonLines, \"..[age \u003e \\\"30\\\"].[0].name\")  // Returns: \"Charlie\"\n```\n\n### Enhanced Result Type\n\n```kotlin\nval result = GSJson.getResult(json, \"age\")\nresult.int()        // Returns: 37\nresult.string()     // Returns: \"37\"\nresult.exists       // Returns: true\nresult.type         // Returns: ResultType.NUMBER\n\n// Array results\nval arrayResult = GSJson.getResult(json, \"friends.[#.first]\")\narrayResult.array().forEach { name -\u003e \n    println(name.string())\n}\n```\n\n### Setting Values\n\n```kotlin\n// Basic setting\nGSJson.set(json, \"age\", 38)\nGSJson.set(json, \"name.middle\", \"J\")\nGSJson.set(json, \"friends.[0].age\", 45)\n\n// Array operations\nGSJson.set(json, \"hobbies.[0]\", \"reading\")\nGSJson.set(json, \"scores\", listOf(85, 90, 78))\n```\n\n### Utility Methods\n\n```kotlin\n// Check existence\nGSJson.exists(json, \"name.first\")          // Returns: true\nGSJson.exists(json, \"name.middle\")         // Returns: false\n\n// Process JSON Lines\nGSJson.forEachLine(jsonLines) { line -\u003e\n    println(\"Name: ${line.get(\"name\").string()}\")\n    true // continue iteration\n}\n```\n\n## Comparison with GJSON\n\nGSJSON maintains the same powerful querying capabilities as GJSON while using slightly different syntax:\n\n| Feature | GJSON | GSJSON |\n|---------|-------|--------|\n| Array filtering | `friends.#(age\u003e40)` | `friends.[age \u003e \"40\"]` |\n| Array access | `friends.0.name` | `friends.[0].name` |\n| All elements | `friends.#.name` | `friends.[#.name]` |\n| Modifiers | `children\\|@reverse` | `children\\|@reverse` |\n\n## Performance\n\nGSJSON is built on Jackson for JSON parsing, providing excellent performance for JSON operations while maintaining the intuitive path syntax inspired by GJSON.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftransportial%2Fgsjson","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftransportial%2Fgsjson","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftransportial%2Fgsjson/lists"}