From 2719bdb660ef133643a04d5c1067ca8aeafc519a Mon Sep 17 00:00:00 2001 From: hunterpayne Date: Mon, 31 Aug 2015 13:51:51 -0700 Subject: [PATCH] Fixing a bug with multiple json objects being sent to the parser in series --- .../jsonpath/internal/token/TokenStack.java | 27 +++++++++++++++---- .../com/jayway/jsonpath/CallbackRecorder.java | 4 +++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/token/TokenStack.java b/json-path/src/main/java/com/jayway/jsonpath/internal/token/TokenStack.java index 9441a02d..ab55f7d2 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/token/TokenStack.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/token/TokenStack.java @@ -58,16 +58,18 @@ public class TokenStack assert(callback != null); boolean needsPathCheck = false; + /* if (null == curr && elements.empty()) { // check for $ patterns for (Path path : paths) { if (path.checkForMatch(this)) { - //if (saveMatch) matchedPaths.put(curr, path); + matchedPaths.put(curr, path); callback.resultFound(path); rootMatch = path; } } } + */ while (parser.nextToken() != null) { boolean saveMatch = false; switch (parser.getCurrentToken()) { @@ -100,7 +102,6 @@ public class TokenStack case START_OBJECT: { if (curr != null && curr.getType() == TokenType.ARRAY_TOKEN) { - if (((ArrayToken)curr).getValue() != null && matchedPaths.containsKey(curr)) { @@ -113,6 +114,15 @@ public class TokenStack callback.resultFound(match); } } + } else if (null == curr && elements.empty()) { + // check for $ patterns + for (Path path : paths) { + if (path.checkForMatch(this)) { + matchedPaths.put(curr, path); + callback.resultFound(path); + rootMatch = path; + } + } } if (curr != null) { @@ -129,9 +139,16 @@ public class TokenStack } case END_OBJECT: { - Path match = matchedPaths.remove(curr); - if (match != null) { - callback.resultFoundExit(match); + if (!"$".equals(curr)) { + Path match = matchedPaths.remove(curr); + if (match != null) { + callback.resultFoundExit(match); + } + } else { + Path match = matchedPaths.get("$"); + if (match != null) { + callback.resultFoundExit(match); + } } elements.pop(); if (elements.empty()) curr = null; diff --git a/json-path/src/test/java/com/jayway/jsonpath/CallbackRecorder.java b/json-path/src/test/java/com/jayway/jsonpath/CallbackRecorder.java index a1ef55a9..1c8d49fc 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/CallbackRecorder.java +++ b/json-path/src/test/java/com/jayway/jsonpath/CallbackRecorder.java @@ -31,6 +31,10 @@ public class CallbackRecorder implements EvaluationCallback { } return false; } + + public String toString() { + return path + " isexit=" + exit; + } } private List results;