How to resolve - This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider"

69 views Asked by At

My application gets a Jackson JsonNode as an input and I am trying to access some fields from it using JsonPath. When I try to access the data, I hit the following exception

com.jayway.jsonpath.PathNotFoundException: Expected to find an object with property ['data'] in path $ but found 'com.fasterxml.jackson.databind.node.ObjectNode'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JacksonJsonProvider'. at com.jayway.jsonpath.internal.path.PropertyPathToken.evaluate(PropertyPathToken.java:71) at com.jayway.jsonpath.internal.path.RootPathToken.evaluate(RootPathToken.java:62) at com.jayway.jsonpath.internal.path.CompiledPath.evaluate(CompiledPath.java:53) at com.jayway.jsonpath.internal.path.CompiledPath.evaluate(CompiledPath.java:61) at com.jayway.jsonpath.JsonPath.read(JsonPath.java:187) at com.jayway.jsonpath.internal.JsonContext.read(JsonContext.java:102) at com.jayway.jsonpath.internal.JsonContext.read(JsonContext.java:89) at com.jayway.jsonpath.JsonPath.read(JsonPath.java:488) at com.uber.schemaless.thecarddivision.utils.JsonPathUtil.parse(JsonPathUtil.java:57)

To simulate this, I wrote a small test program and was able to reproduce the error. Is there something wrong with how am I using JsonPath? The key does exist in the input.

public class JsonPathUtil implements Serializable {
  private static final Logger logger = LoggerFactory.getLogger(JsonPathUtil.class);
  private static final ObjectMapper mapper = new ObjectMapper();

  public JsonPathUtil() {
    Configuration.setDefaults(
        new Configuration.Defaults() {

          private final JsonProvider jsonProvider = new JacksonJsonProvider();
          private final MappingProvider mappingProvider = new JacksonMappingProvider();

          @Override
          public JsonProvider jsonProvider() {
            return jsonProvider;
          }

          @Override
          public MappingProvider mappingProvider() {
            return mappingProvider;
          }

          @Override
          public Set<Option> options() {
            // Ignore not exist exception
            return EnumSet.of(Option.DEFAULT_PATH_LEAF_TO_NULL);
          }
        });
  }

  public static JsonNode parse(@Nonnull JsonNode node, @Nonnull String path) {
    try {
        return JsonPath.read(node, path);
    } catch (Exception e) {
      logger.error("path {} node {}", path, node.toString());
    }
    return mapper.nullNode();
  }
}

Test program

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class mytests extends TestBase {
  public void test1() throws Exception {
    String json =
        "{ \"data\" : {\"cars\" : [{\"make\": \"Honda\", \"year\" : 2020}, {\"make\" : \"toyota\", \"year\": 2021}], \"rental\" : \"yes\"}}";
    ObjectNode input = new ObjectMapper().readValue(json, ObjectNode.class);
    JsonNode value = new JsonPathUtil().parse(input, "$.data.rental");
}

Jsonpath version

com/jayway/jsonpath:json-path-2.4.0.jar

0

There are 0 answers