期望在路径 $ 中找到具有属性 ['xyz'] 的对象,但找到了 'org.json.JSONObject'。根据 JsonProvider,这不是 json 对象:

r08*_*r08 0 java jsonpath

我正在使用json-pathcom.jayway.jsonpath:2.4.0`

爪哇代码:

 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);
}
Run Code Online (Sandbox Code Playgroud)

例外:

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)
Run Code Online (Sandbox Code Playgroud)

如何解决上述异常?

谢谢

mic*_*alk 5

您可以通过配置JsonPath使用JsonOrgJsonProviderprovider来实现这一点,因为默认情况下它使用,JsonSmartJsonProvider因此当您传递JSONObject给此方法时,它无法遍历对象结构:

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);
}
Run Code Online (Sandbox Code Playgroud)

或通过String直接传递:

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);
}
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出:

{category=vehicle}
Run Code Online (Sandbox Code Playgroud)