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

如何用Jackson-databind将JSON中Actions属性按序存入队列并消费

问题:使用Jackson-databind解析JSON并按顺序将Actions属性存入队列

需要使用jackson-databind解析指定JSON文件,将其中Actions类的各个属性按原始JSON中的顺序存入队列,以便后续按顺序消费这些操作。

目标JSON文件内容

{  
  "name": "sampleName",  
  "url": "www.google.com",  
  "dir": "C:\\Users\\user\\Java\\project\\file.json",  
  "actions": {  
    "wait": 3,  
    "click": "route",  
    "write": {  
      "route": "I'm a Path HTML Example",  
      "text": "i'm a example text"  
    },  
    "enter": "enter",  
    "tab": "tab"  
  }
}

现有Actions类代码

public class Actions {    
    private int wait;    
    private String click;    
    private Map<String, Object> write;    
    private String enter;    
    private String tab;    

    @JsonProperty("wait")    
    public int getWait(){        
        return wait;    
    }    
    public void setWait(int wait) {        
        this.wait = wait;    
    }    

    @JsonProperty("click")    
    public String getClick() {        
        return click;    
    }    
    public void setClick(String click) {        
        this.click = click;    
    }    

    @JsonAnyGetter    
    public Map<String, Object> getWrite() {        
        return write;    
    }    
    @JsonAnySetter    
    public void setWrite(Map<String, Object> write) {        
        this.write = write;    
    }    

    @JsonProperty("enter")    
    public String getEnter() {        
        return enter;    
    }    
    public void setEnter(String enter) {        
        this.enter = enter;    
    }    

    @JsonProperty("tab")    
    public String getTab() {        
        return tab;    
    }    
    public void setTab(String tab) {        
        this.tab = tab;    
    }
}

解决方案

1. 修正Actions类的注解与顺序控制

write是JSON中明确定义的属性,不需要使用@JsonAnyGetter/@JsonAnySetter,改用@JsonProperty即可。同时,为了保证Jackson解析时严格遵循JSON中的属性顺序,需要为Actions类添加@JsonPropertyOrder注解指定顺序。

修改后的Actions类:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.util.Map;

@JsonPropertyOrder({"wait", "click", "write", "enter", "tab"})
public class Actions {    
    private int wait;    
    private String click;    
    private Map<String, Object> write;    
    private String enter;    
    private String tab;    

    @JsonProperty("wait")    
    public int getWait(){        
        return wait;    
    }    
    public void setWait(int wait) {        
        this.wait = wait;    
    }    

    @JsonProperty("click")    
    public String getClick() {        
        return click;    
    }    
    public void setClick(String click) {        
        this.click = click;    
    }    

    @JsonProperty("write")    
    public Map<String, Object> getWrite() {        
        return write;    
    }    
    public void setWrite(Map<String, Object> write) {        
        this.write = write;    
    }    

    @JsonProperty("enter")    
    public String getEnter() {        
        return enter;    
    }    
    public void setEnter(String enter) {        
        this.enter = enter;    
    }    

    @JsonProperty("tab")    
    public String getTab() {        
        return tab;    
    }    
    public void setTab(String tab) {        
        this.tab = tab;    
    }
}

2. 创建外层Root类封装整个JSON结构

JSON根节点包含name、url、dir和actions四个属性,需要一个Root类来对应整个结构:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Root {
    @JsonProperty("name")
    private String name;
    @JsonProperty("url")
    private String url;
    @JsonProperty("dir")
    private String dir;
    @JsonProperty("actions")
    private Actions actions;

    // 基础getter/setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    public String getDir() { return dir; }
    public void setDir(String dir) { this.dir = dir; }
    public Actions getActions() { return actions; }
    public void setActions(Actions actions) { this.actions = actions; }
}

3. 解析JSON并按顺序存入队列

使用Jackson的ObjectMapper解析JSON文件,然后按预定义顺序将Actions的属性存入队列:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.LinkedList;
import java.util.Queue;

public class JsonParser {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        // 读取并解析JSON文件为Root对象
        Root root = objectMapper.readValue(new File("path/to/your/target.json"), Root.class);
        Actions actions = root.getActions();

        // 创建队列存储操作
        Queue<Object> actionQueue = new LinkedList<>();

        // 按JSON顺序依次添加属性到队列
        actionQueue.add(actions.getWait());
        actionQueue.add(actions.getClick());
        actionQueue.add(actions.getWrite());
        actionQueue.add(actions.getEnter());
        actionQueue.add(actions.getTab());

        // 测试队列消费逻辑
        while (!actionQueue.isEmpty()) {
            Object action = actionQueue.poll();
            System.out.println("消费操作:" + action);
        }
    }
}

补充说明

  • 如果需要更灵活的顺序处理(避免硬编码getter调用),可以通过Jackson的ObjectReader获取属性顺序信息,或者利用反射结合@JsonPropertyOrder注解遍历字段。
  • 确保项目已正确引入jackson-databind依赖(Maven/Gradle)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:45:58