如何获取JSON数组内对象数量及解决RestAssured遍历views数组问题
嘿,我来帮你搞定这两个JSON相关的问题,一个是获取数组对象数量,另一个是你在RestAssured里遇到的遍历问题:
这个得看你用什么工具处理JSON,我给你说几种常见场景的做法:
用RestAssured的JsonPath处理:
如果JSON数组是顶层结构,或者能通过路径定位到它,直接用getList()方法获取数组,再调用size()就行。比如:// 假设顶层就是数组 int totalCount = response.jsonPath().getList("").size(); // 如果是嵌套数组,比如你示例里的views int viewsCount = response.jsonPath().getList("[0].views").size();用Jackson库处理:
把JSON字符串解析成JsonNode,判断它是ArrayNode后调用size()方法:ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(jsonString); if (rootNode.isArray()) { int count = ((ArrayNode) rootNode).size(); System.out.println("数组内对象数量:" + count); }原生JavaScript(前端场景):
直接访问数组的length属性即可:const jsonArray = [{...}, {...}]; console.log("对象数量:", jsonArray.length);
先帮你分析下原因:看你给出的JSON响应示例,最外层是一个包含单个对象的数组,这个对象里才嵌套了views数组。你现在的代码response.jsonPath().get("views")会提取顶层数组中每个对象的views属性,所以得到的是一个List,里面的元素就是那个views数组本身——所以这个外层List的size自然是1,而不是views数组里的对象数量。
正确的处理方式
你需要精准定位到views数组本身,修改代码如下:
Response response = RestAssured.given().when().get(getURL); // 定位到顶层第一个对象里的views数组 ArrayList<Map<String, Object>> viewsList = response.jsonPath().getList("[0].views"); // 现在这个size就是views里的对象数量了 System.out.println("views数组对象数量:" + viewsList.size()); // 遍历views数组内的对象 for (Map<String, Object> view : viewsList) { String name = (String) view.get("name"); Integer displayOrder = (Integer) view.get("displayOrder"); // 处理每个view对象的逻辑 System.out.println("View名称:" + name + ",排序:" + displayOrder); }
再确认下你的JSON响应结构(格式化后更清晰):
[{
gameIfd: 2018916,
gameIdGlobal: 1948141,
views: [
{ name: "Preview", displayOrder: 1, groups: [], actions: [], localizedName: {} },
{ name: "Thumbnail", ... }
]
}]
最外层是数组,索引0的元素是包含views的对象,所以路径[0].views才能直接拿到你要遍历的目标数组。
内容的提问来源于stack exchange,提问作者Psl

