Skip to content

Commit

Permalink
Merge pull request #148 from zline/master
Browse files Browse the repository at this point in the history
fix for NumberFormatException exception during Criteria evaluation
  • Loading branch information
kallestenflo committed Nov 4, 2015
2 parents de06c44 + fcc81d1 commit 22d8a78
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 3 deletions.
15 changes: 12 additions & 3 deletions json-path/src/main/java/com/jayway/jsonpath/Criteria.java
Expand Up @@ -955,6 +955,7 @@ private static int safeCompare(Object left, Object right, PredicateContext ctx)

boolean leftNullish = isNullish(left);
boolean rightNullish = isNullish(right);
BigDecimal bigDecimal;

if (leftNullish && !rightNullish) {
return -1;
Expand All @@ -965,12 +966,12 @@ private static int safeCompare(Object left, Object right, PredicateContext ctx)
} else if (left instanceof String && right instanceof String) {
String expected = unescape((String) left);
return expected.compareTo((String) right);
} else if (left instanceof Number && right instanceof Number) {
return new BigDecimal(left.toString()).compareTo(new BigDecimal(right.toString()));
} else if (left instanceof Number && right instanceof BigDecimal) {
return new BigDecimal(left.toString()).compareTo((BigDecimal)right);
} else if (left instanceof String && right instanceof Number) {
} else if (left instanceof Number && right instanceof Number) {
return new BigDecimal(left.toString()).compareTo(new BigDecimal(right.toString()));
} else if (left instanceof String && right instanceof Number && (bigDecimal = safeBigDecimal((String)left)) != null) {
return bigDecimal.compareTo(new BigDecimal(right.toString()));
} else if (left instanceof String && right instanceof Boolean) {
Boolean e = Boolean.valueOf((String) left);
Boolean a = (Boolean) right;
Expand All @@ -988,6 +989,14 @@ private static int safeCompare(Object left, Object right, PredicateContext ctx)
}
}

private static BigDecimal safeBigDecimal(final String value) {
try {
return new BigDecimal(value);
} catch (NumberFormatException exc) {
return null;
}
}

private static boolean isNullish(Object o) {
return (o == null || ((o instanceof String) && ("null".equals(o))));
}
Expand Down
33 changes: 33 additions & 0 deletions json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java
@@ -1,5 +1,8 @@
package com.jayway.jsonpath;

import static com.jayway.jsonpath.TestUtils.assertHasNoResults;
import static com.jayway.jsonpath.TestUtils.assertHasOneResult;

import org.junit.Test;

import java.util.ArrayList;
Expand Down Expand Up @@ -163,4 +166,34 @@ public void negate_exists_check_primitive() {
assertThat(isNull).containsExactly(new Integer[]{});
}

@Test
public void equality_check_does_not_break_evaluation() {
assertHasOneResult("[{\"value\":\"5\"}]", "$[?(@.value=='5')]");
assertHasOneResult("[{\"value\":5}]", "$[?(@.value==5)]");

assertHasOneResult("[{\"value\":\"5.1.26\"}]", "$[?(@.value=='5.1.26')]");

assertHasNoResults("[{\"value\":\"5\"}]", "$[?(@.value=='5.1.26')]");
assertHasNoResults("[{\"value\":5}]", "$[?(@.value=='5.1.26')]");
assertHasNoResults("[{\"value\":5.1}]", "$[?(@.value=='5.1.26')]");

assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value=='5')]");
assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value==5)]");
assertHasNoResults("[{\"value\":\"5.1.26\"}]", "$[?(@.value==5.1)]");
}

@Test
public void lt_check_does_not_break_evaluation() {
assertHasOneResult("[{\"value\":\"5\"}]", "$[?(@.value<'7')]");
assertHasNoResults("[{\"value\":\"7\"}]", "$[?(@.value<'5')]");

assertHasOneResult("[{\"value\":5}]", "$[?(@.value<7)]");
assertHasNoResults("[{\"value\":7}]", "$[?(@.value<5)]");

assertHasOneResult("[{\"value\":5}]", "$[?(@.value<7.1)]");
assertHasNoResults("[{\"value\":7}]", "$[?(@.value<5.1)]");

assertHasOneResult("[{\"value\":5.1}]", "$[?(@.value<7)]");
assertHasNoResults("[{\"value\":7.1}]", "$[?(@.value<5)]");
}
}
32 changes: 32 additions & 0 deletions json-path/src/test/java/com/jayway/jsonpath/TestUtils.java
@@ -1,6 +1,9 @@
package com.jayway.jsonpath;

import java.util.List;

import static com.jayway.jsonpath.JsonPath.using;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;

public final class TestUtils {
Expand Down Expand Up @@ -29,4 +32,33 @@ public static void assertEvaluationThrows(final String json, final String path,
throw exc;
}
}

/**
* Assertion which requires empty list as a result of indefinite path search.
* @param json json to be parsed
* @param path path to be evaluated
*/
public static void assertHasNoResults(final String json, final String path) {
assertHasResults(json, path, 0);
}

/**
* Assertion which requires list of one element as a result of indefinite path search.
* @param json json to be parsed
* @param path path to be evaluated
*/
public static void assertHasOneResult(final String json, final String path) {
assertHasResults(json, path, 1);
}

/**
* Shortcut for counting found nodes.
* @param json json to be parsed
* @param path path to be evaluated
* @param expectedResultCount expected number of nodes to be found
*/
public static void assertHasResults(final String json, final String path, final int expectedResultCount) {
final List<Object> result = JsonPath.parse(json).read(path);
assertThat(result).hasSize(expectedResultCount);
}
}

0 comments on commit 22d8a78

Please sign in to comment.