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