You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:56