java - 将动态 json 属性添加为 jackson 的 java pojo

标签 java jackson

我需要从 Java pojo 创建一个像这样的 Json 负载:

{ "update" : {
    "labels" : [{"add" : "A label"} ]
    }
 }

所以我创建了一个像这样的 Java pojo:

@JsonRootName(value = "update")
public class AddLabel{
  @JsonProperty("labels")
  public List<Label> labels; 
  public AddLabel(String labelName){
     this.labels = new ArrayList<>(); 
     this.labels.add(new Label(labelName); 
  }
  public static class Label{
    public String add; 
    public Label(String labelName){
       this.add = labelName; 
    }
  }
}

我喜欢将 Label 类中的“add”属性设为动态,这样它也可以采用诸如“remove”、“set”之类的值。除了为他们每个人创建另一个 POJO 之外,有没有办法做到这一点?

最佳答案

您可以使用 JsonAnyGetter允许创建动态 key-value 对的注解。下面的示例展示了我们如何为同一个 Label 类生成 3 个不同的键:

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        AddLabel label = new AddLabel("A label");
        label.getLabels().add(AddLabel.Label.remove("Remove"));
        label.getLabels().add(AddLabel.Label.set("Set"));

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        System.out.println(mapper.writeValueAsString(label));
    }
}

@JsonRootName(value = "update")
class AddLabel {

    @JsonProperty("labels")
    private List<Label> labels;

    public AddLabel(String labelName) {
        this.labels = new ArrayList<>();
        this.labels.add(Label.add(labelName));
    }

    public List<Label> getLabels() {
        return labels;
    }

    public static class Label {

        private final String key;
        private final String value;

        private Label(String key, String value) {
            this.key = key;
            this.value = value;
        }

        public static Label add(String value) {
            return new Label("add", value);
        }

        public static Label remove(String value) {
            return new Label("remove", value);
        }

        public static Label set(String value) {
            return new Label("set", value);
        }

        @JsonAnyGetter
        public Map<String, String> getDynamic() {
            return Collections.singletonMap(key, value);
        }
    }
}

以上代码打印:

{
  "labels" : [ {
    "add" : "A label"
  }, {
    "remove" : "Remove"
  }, {
    "set" : "Set"
  } ]
}

另见:

关于java - 将动态 json 属性添加为 jackson 的 java pojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245719/

相关文章:

java - 使用 Java 识别 wav 文件中的声音片段

java - 无法使用 Jackson 解析 xml 中的元素列表

Java:非空方法作为映射值

java - 收听 RabbitMQ 队列并获取事件通知

java - 如何根据方法忽略字段?

java - Spring配置@ResponseBody JSON格式

java - 如何使用 Jackson/其他库将 json 响应对象映射到首选格式?

jaxb - Umarshall JSON 对象,在 Jackson 和 JAXB 之间带有下划线和驼峰式字段

java - 混合读取的gson

java - 在 Assert.fail() 中添加消息