Java中断言JSON数组userDetails的userId按升/降序排序的最优方法
嘿,这个需求很常见,我给你整理了一套完整的Java实现方案,包括JSON解析、排序判断和测试用例,一起来看看吧:
解决方案
1. 定义对应JSON的实体类
首先我们需要创建一个POJO类,用来映射JSON里的userDetails对象,方便后续处理:
import com.fasterxml.jackson.annotation.JsonProperty; public class UserDetails { @JsonProperty("userId") private int userId; @JsonProperty("userName") private String userName; // 必须提供getter方法,Jackson需要通过它访问属性 public int getUserId() { return userId; } public String getUserName() { return userName; } }
2. 解析JSON字符串为Java对象
我们用Jackson(Java生态最常用的JSON处理库)来把JSON字符串转成List<UserDetails>:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class JsonParser { // 复用ObjectMapper实例,避免重复创建 private static final ObjectMapper objectMapper = new ObjectMapper(); public static List<UserDetails> parseUserDetails(String json) throws Exception { // 注意:你的原始JSON缺少外层大括号,应该是{"userDetails": [...]}格式,解析时要传入完整的JSON return objectMapper.readValue(json, new TypeReference<List<UserDetails>>() {}); } }
3. 编写排序断言逻辑
这里提供两种方式,你可以根据自己的习惯选择:
方式一:手动遍历判断(适合自定义逻辑场景)
写两个工具方法,分别判断数组是否按userId升序或降序排列:
import java.util.List; public class SortValidator { // 判断是否按userId升序排序 public static boolean isAscendingByUserId(List<UserDetails> userDetailsList) { // 空数组或单个元素默认视为有序 if (userDetailsList == null || userDetailsList.size() <= 1) { return true; } // 遍历比较相邻元素的userId for (int i = 0; i < userDetailsList.size() - 1; i++) { if (userDetailsList.get(i).getUserId() > userDetailsList.get(i + 1).getUserId()) { return false; } } return true; } // 判断是否按userId降序排序 public static boolean isDescendingByUserId(List<UserDetails> userDetailsList) { if (userDetailsList == null || userDetailsList.size() <= 1) { return true; } for (int i = 0; i < userDetailsList.size() - 1; i++) { if (userDetailsList.get(i).getUserId() < userDetailsList.get(i + 1).getUserId()) { return false; } } return true; } }
方式二:用AssertJ简化断言(推荐,代码更简洁)
如果你用AssertJ测试框架,可以直接用它内置的排序断言方法,不用手动写遍历逻辑:
import org.assertj.core.api.Assertions; import java.util.Comparator; import java.util.List; // 在你的测试方法中调用 List<UserDetails> userDetails = JsonParser.parseUserDetails(yourCompleteJsonString); // 断言数组按userId升序排列 Assertions.assertThat(userDetails) .isSortedAccordingTo(Comparator.comparingInt(UserDetails::getUserId)); // 断言数组按userId降序排列 Assertions.assertThat(userDetails) .isSortedAccordingTo(Comparator.comparingInt(UserDetails::getUserId).reversed());
4. 完整测试用例示例(JUnit 5)
这里给你写一个完整的JUnit 5测试用例,验证上面的逻辑:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; public class UserDetailsSortTest { // 修正后的完整JSON字符串 private final String ascendingJson = "{\"userDetails\":[ { \"userId\" : 1, \"userName\" : \"abc\" }, { \"userId\" : 2, \"userName\" : \"bcd\" } ]}"; private final String descendingJson = "{\"userDetails\":[ { \"userId\" : 2, \"userName\" : \"bcd\" }, { \"userId\" : 1, \"userName\" : \"abc\" } ]}"; @Test void testUserDetailsAreAscending() throws Exception { List<UserDetails> userDetails = JsonParser.parseUserDetails(ascendingJson); // 用手动判断的方式断言 assertTrue(SortValidator.isAscendingByUserId(userDetails)); // 或者用AssertJ的方式 // Assertions.assertThat(userDetails).isSortedAccordingTo(Comparator.comparingInt(UserDetails::getUserId)); } @Test void testUserDetailsAreDescending() throws Exception { List<UserDetails> userDetails = JsonParser.parseUserDetails(descendingJson); assertTrue(SortValidator.isDescendingByUserId(userDetails)); } }
依赖说明
如果你的项目还没引入相关依赖,需要在Maven的pom.xml中添加:
- Jackson依赖(用于JSON解析):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 建议使用最新稳定版 --> </dependency>
- AssertJ依赖(如果用它的断言):
<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.24.2</version> <scope>test</scope> </dependency>
内容的提问来源于stack exchange,提问作者test-profile
相关产品推荐
相关产品推荐

