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

如何在Java中基于timestamp提取最新的JSON对象

如何在Java中从日志API返回的列表里提取最新的日志数据

我有一个日志内容API,返回的是包含交易日志详情的JSON对象列表。每次发送GET请求时,当前请求的详情会被记录到日志表,API会返回此次及之前的所有日志内容——比如调用5次就会返回5个对象。这些对象除了timestamp字段外其他都相同,我需要基于timestamp字段正确提取出最新的那条日志数据。

示例返回数据:

[
    {
        "type": "SERVICE_CALL",
        "timestamp": "2022-12-14T10:03:01.343Z",
        "method": "GET",
        "uri": "<test>/v5/accounts/123",
        "requestBody": "",
        "requestTime": "",
        "statusCode": 404
    },
    {
        "type": "SERVICE_CALL",
        "timestamp": "2022-12-14T10:03:30.343Z",
        "method": "GET",
        "uri": "<test>/v5/accounts/123",
        "requestBody": "",
        "requestTime": "",
        "statusCode": 404
    }
]

示例里两条日志只有timestamp有秒级差异,要获取最新的那条,该怎么用Java实现?


实现步骤与代码示例

1. 定义日志数据实体类

首先需要把JSON映射为Java对象,这里以常用的Jackson库为例,定义实体类:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.Instant;

public class LogEntry {
    @JsonProperty("type")
    private String type;
    
    @JsonProperty("timestamp")
    private Instant timestamp;
    
    @JsonProperty("method")
    private String method;
    
    @JsonProperty("uri")
    private String uri;
    
    @JsonProperty("requestBody")
    private String requestBody;
    
    @JsonProperty("requestTime")
    private String requestTime;
    
    @JsonProperty("statusCode")
    private int statusCode;

    // 生成timestamp的getter方法(用于时间比较)
    public Instant getTimestamp() {
        return timestamp;
    }

    // 按需生成其他字段的getter/setter,或使用Lombok简化代码
    @Override
    public String toString() {
        return "LogEntry{" +
                "type='" + type + '\'' +
                ", timestamp=" + timestamp +
                ", method='" + method + '\'' +
                ", uri='" + uri + '\'' +
                ", statusCode=" + statusCode +
                '}';
    }
}

用Instant可以直接解析API返回的ISO 8601格式时间字符串,Jackson会自动完成反序列化。

2. 解析JSON并筛选最新日志

方式一:Java Stream API(简洁高效,Java 8+)

先把API返回的JSON字符串解析为List<LogEntry>,再用Stream的max方法根据时间戳排序筛选:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Optional;

public class LogProcessor {
    public static void main(String[] args) throws Exception {
        String jsonResponse = "API返回的JSON字符串"; // 替换为实际API返回内容
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 解析JSON为日志列表
        List<LogEntry> logEntries = objectMapper.readValue(
                jsonResponse,
                objectMapper.getTypeFactory().constructCollectionType(List.class, LogEntry.class)
        );
        
        // 筛选timestamp最新的日志
        Optional<LogEntry> latestLog = logEntries.stream()
                .max((log1, log2) -> log1.getTimestamp().compareTo(log2.getTimestamp()));
        
        // 处理结果,避免空指针
        latestLog.ifPresent(log -> System.out.println("最新日志:" + log));
    }
}

Instant的自然排序规则是时间越晚,值越大,所以max方法会直接返回最新的日志条目。

方式二:传统循环遍历(兼容Java 8之前版本)

如果项目使用低版本Java,可以手动遍历比较:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;

public class LogProcessor {
    public static void main(String[] args) throws Exception {
        String jsonResponse = "API返回的JSON字符串";
        ObjectMapper objectMapper = new ObjectMapper();
        List<LogEntry> logEntries = objectMapper.readValue(
                jsonResponse,
                objectMapper.getTypeFactory().constructCollectionType(List.class, LogEntry.class)
        );
        
        LogEntry latestLog = null;
        for (LogEntry log : logEntries) {
            if (latestLog == null || log.getTimestamp().isAfter(latestLog.getTimestamp())) {
                latestLog = log;
            }
        }
        
        if (latestLog != null) {
            System.out.println("最新日志:" + latestLog);
        }
    }
}

通过isAfter方法判断当前日志时间是否晚于已记录的最新日志,实时更新最新日志对象。

3. 注意事项

  • 如果API返回的timestamp格式非标准ISO 8601,需要在实体类的timestamp字段上添加@JsonFormat指定格式,比如:
    @JsonProperty("timestamp")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    private Instant timestamp;
    
  • 要处理API返回空列表的情况,避免Optional.empty()或latestLog == null引发的空指针异常。

内容的提问来源于stack exchange,提问作者mmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00