0

I am using json-path com.jayway.jsonpath:2.4.0`

Java code:

 public static void main( String[] args )
{
       
    JSONObject jObject =new JSONObject("{\r\n  \"structure\": {\r\n    \"tables\": {\r\n      \"category\": \"vehicle\"\r\n    }\r\n  },\r\n  \"data\": {}\r\n}") ;
    Object jsonPathArray = JsonPath.read(jObject,"$.structure.tables");
 
    System.out.println(jsonPathArray);
}

Exception:

Exception in thread "main" com.jayway.jsonpath.PathNotFoundException: Expected to find an object with property ['structure'] in path $ but found 'org.json.JSONObject'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.
    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 rxjava.testapp.App.main(App.java:21)

how to solve the above exception?

Thanks

cj devin
  • 1,045
  • 3
  • 13
  • 48

2 Answers2

10

You can achieve this by configuring JsonPath to use JsonOrgJsonProvider provider because by default it uses JsonSmartJsonProvider so when you pass JSONObject to this method it cannot traverse the object structure :

public static void main( String[] args ) {
    JSONObject jObject = new JSONObject("{\r\n  \"structure\": {\r\n    \"tables\": {\r\n      \"category\": \"vehicle\"\r\n    }\r\n  },\r\n  \"data\": {}\r\n}") ;
        
    Configuration configuration = Configuration.builder()
            .jsonProvider(new JsonOrgJsonProvider())
            .build();

    JsonPath jsonPath = JsonPath.compile("$.structure.tables");
    Object jsonPathArray= jsonPath.read(jObject, configuration);

    System.out.println(jsonPathArray);
}

or by passing a String directly :

public static void main( String[] args ) {
    JSONObject jObject = new JSONObject("{\r\n  \"structure\": {\r\n    \"tables\": {\r\n      \"category\": \"vehicle\"\r\n    }\r\n  },\r\n  \"data\": {}\r\n}") ;

    Object jsonPathArray= JsonPath.read(jObject.toString(),"$.structure.tables");

    System.out.println(jsonPathArray);
}

Output in both cases :

{category=vehicle}
Michał Krzywański
  • 15,659
  • 4
  • 36
  • 63
1

Simply used JacksonJsonProvider to solve this as Jackson is a well-developed library that understands the object structure and hierarchy.

public static void main( String[] args ) {

     JSONObject jObject = new JSONObject("{\r\n  \"structure\": {\r\n    \"tables\": {\r\n      \"category\": \"vehicle\"\r\n    }\r\n  },\r\n  \"data\": {}\r\n}") ;
    
     Configuration configuration = Configuration.builder()
             .jsonProvider(new JacksonJsonProvider())
             .build();

     DocumentContext jsonContext = JsonPath.using(conf).parse(jObject.toString());
     Object jsonPathArray= jsonContext.read("$.structure.tables");
     System.out.println(jsonPathArray);
}

In case of Java Object as input in place of JSONObject,use an ObjectMapper to use the same function as above.

ObjectMapper mapper = new ObjectMapper();
String jsonData = mapper.writeValueAsString(object);
Configuration conf = Configuration.builder()
            .jsonProvider(new JacksonJsonProvider())
            .build();
DocumentContext jsonContext = JsonPath.using(conf).parse(jObject.toString());
dilesh yadav
  • 81
  • 1
  • 3