遍历 JsonPath 数组的策略

Strategies for iterating through JsonPath array

我今天才开始探索 JsonPath。我不仅想探索用它做什么,还想探索一些有效的策略。

例如,假设我必须遍历包含在 json 字符串中的一个元素中的数组。

我正在使用 https://github.com/jayway/JsonPath#path-examples 中的 "store" 示例。

要获取图书列表本身,我想我可以这样做:

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

这样想有意义吗?

这是我不确定的迭代逻辑。

我原以为我可以定义一个 "Book" pojo 然后做这样的事情:

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

但是,这不起作用。 “read”方法此时returns一个JSONArray.

https://github.com/jayway/JsonPath#what-is-returned-when 处代码示例的最后一行与我正在查看的内容很接近,但这需要在每次迭代中解析 json。似乎“DocumentContext”class 有“read”方法可以接受类型参数,但没有“JsonPath”。

导航这样的东西有哪些合理的策略?

JSON 路径只会 return 你一个 Maps 的列表,你肯定已经看到了。您需要一种方法来告诉它如何将这些值映射到一个对象——为此您需要一个自定义配置。还有其他提供程序,如 Gson 等,但我只使用 Jackson。

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 对象列表。