From 58c0474f29e6af34ead2b11addb50c8bf77a1f6c Mon Sep 17 00:00:00 2001 From: Kalle Stenflo Date: Wed, 21 Aug 2013 10:22:57 +0200 Subject: [PATCH] Fixed issue with attribs named '$'. --- .../java/com/jayway/jsonpath/Criteria.java | 2 +- .../java/com/jayway/jsonpath/JsonPath.java | 3 +++ .../jayway/jsonpath/internal/PathToken.java | 13 +++++++----- .../jsonpath/internal/PathTokenizer.java | 20 ++++++++++++++++++- .../internal/filter/FilterFactory.java | 8 ++++++-- .../java/com/jayway/jsonpath/IssuesTest.java | 18 +++++++++++++++++ 6 files changed, 55 insertions(+), 9 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/Criteria.java b/json-path/src/main/java/com/jayway/jsonpath/Criteria.java index 8e67cf10..84aa642f 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/Criteria.java +++ b/json-path/src/main/java/com/jayway/jsonpath/Criteria.java @@ -297,7 +297,7 @@ public class Criteria { return objectOrAnyCollectionItemMatches(actualVal, new Predicate() { @Override public boolean accept(Object value) { - if (isValue == null) { + if (isValue == null) { return value == null; } else { return isValue.equals(value); diff --git a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java index 230492bf..c20c779f 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java @@ -115,6 +115,9 @@ public class JsonPath { isTrue(filterCountInPath == filters.length, "Filters in path ([?]) does not match provided filters."); this.tokenizer = new PathTokenizer(jsonPath); + + //System.out.println(tokenizer.toString()); + this.filters = new LinkedList(); this.filters.addAll(asList(filters)); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/PathToken.java b/json-path/src/main/java/com/jayway/jsonpath/internal/PathToken.java index 5c49ff40..740133d0 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/PathToken.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/PathToken.java @@ -31,20 +31,23 @@ public class PathToken { private String fragment; - public PathToken(String fragment) { + private int tokenIndex; + + public PathToken(String fragment, int tokenIndex) { this.fragment = fragment; + this.tokenIndex = tokenIndex; } public PathTokenFilter getFilter(){ - return FilterFactory.createFilter(fragment); + return FilterFactory.createFilter(this); } public Object filter(Object model, JsonProvider jsonProvider){ - return FilterFactory.createFilter(fragment).filter(model, jsonProvider); + return FilterFactory.createFilter(this).filter(model, jsonProvider); } public Object apply(Object model, JsonProvider jsonProvider){ - return FilterFactory.createFilter(fragment).getRef(model, jsonProvider); + return FilterFactory.createFilter(this).getRef(model, jsonProvider); } public String getFragment() { @@ -52,7 +55,7 @@ public class PathToken { } public boolean isRootToken(){ - return "$".equals(fragment); + return this.tokenIndex == 0; } public boolean isArrayIndexToken(){ return ARRAY_INDEX_PATTERN.matcher(fragment).matches(); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/PathTokenizer.java b/json-path/src/main/java/com/jayway/jsonpath/internal/PathTokenizer.java index 2e4980aa..2c119551 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/PathTokenizer.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/PathTokenizer.java @@ -16,6 +16,7 @@ package com.jayway.jsonpath.internal; import com.jayway.jsonpath.InvalidPathException; +import java.util.Formatter; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -37,8 +38,11 @@ public class PathTokenizer implements Iterable { } this.pathChars = jsonPath.toCharArray(); + + int i = 0; for (String pathFragment : splitPath()) { - pathTokens.add(new PathToken(pathFragment)); + pathTokens.add(new PathToken(pathFragment, i)); + i++; } } @@ -255,4 +259,18 @@ public class PathTokenizer implements Iterable { } } + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("-----------------------------------------------------------------").append("\n"); + sb.append("PATH: ").append(getPath()).append("\n"); + sb.append(String.format("%-50s%-10s%-10s", "Fragment", "Root", "Array")).append("\n"); + sb.append("-----------------------------------------------------------------").append("\n"); + for (PathToken pathToken : pathTokens) { + sb.append(String.format("%-50s%-10b%-10b", pathToken.getFragment(), pathToken.isRootToken(), pathToken.isArrayIndexToken())).append("\n");; + } + return sb.toString(); + + } } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java index 1c1e2869..5fff1389 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterFactory.java @@ -14,6 +14,8 @@ */ package com.jayway.jsonpath.internal.filter; +import com.jayway.jsonpath.internal.PathToken; + /** * @author Kalle Stenflo */ @@ -25,9 +27,11 @@ public class FilterFactory { private final static PathTokenFilter SCAN_FILTER = new ScanFilter(".."); private final static PathTokenFilter ARRAY_QUERY_FILTER = new ArrayQueryFilter("[?]"); - public static PathTokenFilter createFilter(String pathFragment) { + public static PathTokenFilter createFilter(PathToken token) { + + String pathFragment = token.getFragment(); - if (DOCUMENT_FILTER.getCondition().equals(pathFragment)) { //"$" + if (DOCUMENT_FILTER.getCondition().equals(pathFragment) && token.isRootToken()) { //"$" return DOCUMENT_FILTER; diff --git a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java index 67f19cbe..c7351908 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java @@ -1,6 +1,8 @@ package com.jayway.jsonpath; import com.jayway.jsonpath.internal.IOUtils; +import com.jayway.jsonpath.spi.JsonProviderFactory; +import com.jayway.jsonpath.spi.impl.JacksonProvider; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; @@ -149,6 +151,22 @@ public class IssuesTest { assertTrue(result.size() == 1); } + @Test + public void issue_30() throws Exception { + String json = "{\"foo\" : {\"@id\" : \"123\", \"$\" : \"hello\"}}"; + + assertEquals("123", JsonPath.read(json, "foo.@id")); + assertEquals("hello", JsonPath.read(json, "foo.$")); + } + + @Test + public void issue_32(){ + + + + String json = "{\"text\" : \"skill: \\\"Heuristic Evaluation\\\"\", \"country\" : \"\"}"; + assertEquals("skill: \"Heuristic Evaluation\"", JsonPath.read(json, "$.text")); + } }