json-path/JsonPath · error · InvalidPathException
Arguments to function: '' are not closed properly.
Error message
Arguments to function: '' are not closed properly.
What it means
When the compiler scans a function-call token `name(...)`, it tracks parenthesis nesting; if the closing parenthesis is never found before the path string ends, the arguments are considered unclosed and compilation throws InvalidPathException naming the function.
Source
Thrown at json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java:226
endPosition = path.length();
}
List<Parameter> functionParameters = null;
if (isFunction) {
int parenthesis_count = 1;
for(int i = readPosition + 1; i < path.length(); i++){
if (path.charAt(i) == CLOSE_PARENTHESIS)
parenthesis_count--;
else if (path.charAt(i) == OPEN_PARENTHESIS)
parenthesis_count++;
if (parenthesis_count == 0)
break;
}
if (parenthesis_count != 0){
String functionName = path.subSequence(startPosition, endPosition).toString();
throw new InvalidPathException("Arguments to function: '" + functionName + "' are not closed properly.");
}
if (path.inBounds(readPosition+1)) {
// read the next token to determine if we have a simple no-args function call
char c = path.charAt(readPosition + 1);
if (c != CLOSE_PARENTHESIS) {
path.setPosition(endPosition+1);
// parse the arguments of the function - arguments that are inner queries or JSON document(s)
String functionName = path.subSequence(startPosition, endPosition).toString();
functionParameters = parseFunctionParameters(functionName);
} else {
path.setPosition(readPosition + 1);
}
}
else {
path.setPosition(readPosition);
}
}View on GitHub (pinned to 62a4c9f0f6)
Solutions
- Balance the parentheses in the path, e.g. `$.length(` → `$.length()`.
- For filters with functions, ensure the whole predicate is closed: `$[?(@.x.length() > 2)]`.
- When generating paths in code, count/verify parentheses before compiling, and log the full untruncated path on failure.
Example fix
// before
JsonPath.read(json, "$.items.length(");
// after
JsonPath.read(json, "$.items.length()"); Defensive patterns
Strategy: validation
Validate before calling
boolean parensBalanced(String path) {
int n = 0;
for (char c : path.toCharArray()) {
if (c == '(') n++;
if (c == ')') n--;
if (n < 0) return false;
}
return n == 0;
} Try / catch
try {
return JsonPath.read(json, path);
} catch (InvalidPathException e) {
throw new IllegalArgumentException("Unclosed function arguments in path: " + path, e);
} Prevention
- Count parentheses when generating function-call paths.
- Build filter+function expressions with helper methods instead of raw string concatenation.
- Avoid truncating long path strings in config or logs that are later re-parsed.
When it happens
Trigger: Paths with unbalanced parentheses such as `$.length()` written as `$.length(`, nested calls missing a close like `$.sum((@.x, @.y`, or truncation of a long path string.
Common situations: Hand-written function paths (length, min, max, avg, concat, etc.) with typos; string truncation in logs/configs; generated filter expressions where the closing paren was appended after a conditional that got skipped.
Related errors
- Function with name: does not exist.
- Failed to parse ArrayIndexOperation:
- Failed to parse token in ArrayIndexOperation:
- Path must start with '$' or '@'
- Path must not end with a '.
AI-assisted analysis of json-path/JsonPath@62a4c9f0f6 (2026-09-11).
Data as JSON: /api/errors/7a7c61b95ce79eda.
Report an issue: GitHub.