2017-03-23 104 views
0

我剛開始探索JsonPath。我想探索的不僅僅是可以用它做什麼,而是一些有效的策略。例如,假設我必須迭代json字符串中一個元素中包含的數組。迭代通過JsonPath數組的策略

我使用https://github.com/jayway/JsonPath#path-examples中的「商店」示例。

要得到的書籍列表本身,我想我可以做這樣的事情:

List<?> allBooks = JsonPath.<List<?>>read(context, "$.store.book"); 

是否有意義,以這種方式考慮一下?

這是迭代通過這個我不確定的邏輯。

我本來以爲我可以定義一個「書」 POJO,然後做這樣的事情:

for (int ctr = 0; ctr < allBooks.size(); ++ ctr) { 
     Book book = JsonPath.<Book>read(context, ".[" + ctr + "]"); 
     System.out.println("book[" + book + "]"); 
    } 

但是,這是行不通的。此時的「read」方法返回JSONArray

https://github.com/jayway/JsonPath#what-is-returned-when代碼示例中的最後一行與我正在查看的內容很接近,但是這需要在每次迭代中解析json。看起來像「DocumentContext」類有「read」方法可以採取類型參數,但不是「JsonPath」。

什麼是這樣的導航的一些合理的策略?

回答

1

JSON路徑只會返回給您一個列表Maps,因爲您毫無疑問已經看到了。您需要一種方式來告訴它如何將這些值映射到對象 - 爲此,您將需要一個自定義配置。還有其他提供商,如Gson等,但我只使用過傑克遜。

Configuration configuration = Configuration 
     .builder() 
     .jsonProvider(new JacksonJsonProvider()) 
     .mappingProvider(new JacksonMappingProvider()) 
     .build(); 

的第二個步驟是與TypeRef指定通用類型信息並把它讀取標籤時沿。

List<Book> allBooks = JsonPath.using(configuration) 
     .parse(context) 
     .read("$.store.book", new TypeRef<List<Book>>() {}); 

因此,您會得到一個不錯的Book對象列表。

+0

這工作正常,但我注意到JsonPath的主文檔頁(https://github.com/jayway/JsonPath)甚至沒有提及TypeRef。我猜測使用TypeRef就像使用Class對象,但它有效地傳達了泛型類型信息。 –