Ожидалось найти объект со свойством [‘xyz’] в path $, но найдено ‘org.json.JSONObject’. Это не объект json в соответствии с JsonProvider:

#java #jsonpath

#java #jsonpath

Вопрос:

Я использую json-path com.jayway.jsonpath:2.4.0`

Код Java:

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

Исключение:

 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)
  

как решить вышеупомянутое исключение?

Спасибо

Ответ №1:

Вы можете достичь этого, настроив JsonPath использование JsonOrgJsonProvider поставщика, потому что по умолчанию он использует JsonSmartJsonProvider поэтому, когда вы переходите JSONObject к этому методу, он не может перемещаться по структуре объекта :

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

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

    System.out.println(jsonPathArray);
}
  

или путем передачи String напрямую :

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

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

    System.out.println(jsonPathArray);
}
  

Вывод в обоих случаях :

 {category=vehicle}
  

Ответ №2:

Просто используется JacksonJsonProvider для решения этой проблемы, поскольку Jackson — это хорошо разработанная библиотека, которая понимает структуру объекта и иерархию.

 public static void main( String[] args ) {

     JSONObject jObject = new JSONObject("{rn  "structure": {rn    "tables": {rn      "category": "vehicle"rn    }rn  },rn  "data": {}rn}") ;
    
     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);
}
  

В случае Java Object ввода вместо JSONObject , используйте ObjectMapper для использования той же функции, что и выше.

 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());