遍历 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
对象列表。
我今天才开始探索 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
对象列表。