diff --git a/README.md b/README.md index 0109c7ba..c7802c2c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Jayway JsonPath **A Java DSL for reading JSON documents.** -[![Build Status](https://travis-ci.org/jayway/JsonPath.svg?branch=master)](https://travis-ci.org/jayway/JsonPath) +[![Build Status](https://travis-ci.org/json-path/JsonPath.svg?branch=master)](https://travis-ci.org/json-path/JsonPath) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.jayway.jsonpath/json-path/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.jayway.jsonpath/json-path) [![Javadoc](https://javadoc-emblem.rhcloud.com/doc/com.jayway.jsonpath/json-path/badge.svg)](http://www.javadoc.io/doc/com.jayway.jsonpath/json-path) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java index 08d257c4..9989dd95 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java @@ -359,20 +359,19 @@ public abstract class ValueNode { } public boolean isArray(Predicate.PredicateContext ctx) { - return parse(ctx) instanceof List; + return ctx.configuration().jsonProvider().isArray(parse(ctx)); } public boolean isMap(Predicate.PredicateContext ctx) { - return parse(ctx) instanceof Map; + return ctx.configuration().jsonProvider().isMap(parse(ctx)); } public int length(Predicate.PredicateContext ctx) { - return isArray(ctx) ? ((List) parse(ctx)).size() : -1; + return isArray(ctx) ? ctx.configuration().jsonProvider().length(parse(ctx)) : -1; } public boolean isEmpty(Predicate.PredicateContext ctx) { - if (isArray(ctx)) return ((List) parse(ctx)).size() == 0; - else if (isMap(ctx)) return ((Map) parse(ctx)).size() == 0; + if (isArray(ctx) || isMap(ctx)) return ctx.configuration().jsonProvider().length(parse(ctx)) == 0; else if((parse(ctx) instanceof String)) return ((String)parse(ctx)).length() == 0; return true; } diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/GsonMappingProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/GsonMappingProvider.java index 7e5153b4..2b5ead3c 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/GsonMappingProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/GsonMappingProvider.java @@ -62,6 +62,9 @@ public class GsonMappingProvider implements MappingProvider { @Override public T map(Object source, Class targetType, Configuration configuration) { + if(source == null){ + return null; + } try { return factory.call().getAdapter(targetType).fromJsonTree((JsonElement) source); } catch (Exception e){ @@ -71,6 +74,9 @@ public class GsonMappingProvider implements MappingProvider { @Override public T map(Object source, TypeRef targetType, Configuration configuration) { + if(source == null){ + return null; + } try { return (T) factory.call().getAdapter(TypeToken.get(targetType.getType())).fromJsonTree((JsonElement) source); } catch (Exception e){ diff --git a/json-path/src/test/java/com/jayway/jsonpath/GsonJsonProviderTest.java b/json-path/src/test/java/com/jayway/jsonpath/GsonJsonProviderTest.java index 1fc85bd9..5cca22b4 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/GsonJsonProviderTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/GsonJsonProviderTest.java @@ -3,6 +3,8 @@ package com.jayway.jsonpath; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.jayway.jsonpath.spi.json.GsonJsonProvider; +import com.jayway.jsonpath.spi.mapper.GsonMappingProvider; import com.jayway.jsonpath.spi.mapper.MappingException; import org.junit.Test; @@ -181,6 +183,25 @@ public class GsonJsonProviderTest extends BaseTest { using(GSON_CONFIGURATION).parse(JSON).read("$", typeRef); } + + @Test + // https://github.com/json-path/JsonPath/issues/351 + public void no_error_when_mapping_null() throws IOException { + + Configuration configuration = Configuration + .builder() + .mappingProvider(new GsonMappingProvider()) + .jsonProvider(new GsonJsonProvider()) + .options(Option.DEFAULT_PATH_LEAF_TO_NULL, Option.SUPPRESS_EXCEPTIONS) + .build(); + + String json = "{\"M\":[]}"; + + String result = JsonPath.using(configuration).parse(json).read("$.M[0].A[0]", String.class); + + assertThat(result).isNull(); + } + public static class FooBarBaz { public T gen; diff --git a/json-path/src/test/java/com/jayway/jsonpath/JacksonJsonNodeJsonProviderTest.java b/json-path/src/test/java/com/jayway/jsonpath/JacksonJsonNodeJsonProviderTest.java index 8476b5e2..0267590a 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JacksonJsonNodeJsonProviderTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JacksonJsonNodeJsonProviderTest.java @@ -122,6 +122,33 @@ public class JacksonJsonNodeJsonProviderTest extends BaseTest { String id = context.read("$.data.id", String.class); assertThat(id).isEqualTo(uuid.toString()); } + // https://github.com/json-path/JsonPath/issues/366 + public void empty_array_check_works() throws IOException { + String json = "[" + + " {" + + " \"name\": \"a\"," + + " \"groups\": [{" + + " \"type\": \"phase\"," + + " \"name\": \"alpha\"" + + " }, {" + + " \"type\": \"not_phase\"," + + " \"name\": \"beta\"" + + " }]" + + " }, {" + + " \"name\": \"b\"," + + " \"groups\": [{" + + " \"type\": \"phase\"," + + " \"name\": \"beta\"" + + " }, {" + + " \"type\": \"not_phase\"," + + " \"name\": \"alpha\"" + + " }]" + + " }" + + "]"; + ArrayNode node = using(JACKSON_JSON_NODE_CONFIGURATION).parse(json).read("$[?(@.groups[?(@.type == 'phase' && @.name == 'alpha')] empty false)]"); + assertThat(node.size()).isEqualTo(1); + assertThat(node.get(0).get("name").asText()).isEqualTo("a"); + } public static class FooBarBaz { public T gen;