我需要从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之外,还有其他方法吗?
答案 0 :(得分:1)
您的规范不清楚,您会执行许多相同的操作(添加,删除等)还是最多执行一项操作?
第一个选项
如果同一动作最多只有一个实例,则可以用常规对象替换该数组:
{ "update" : {
"labels" : {
"add" : "A label",
"remove" : "B label"
}
}
}
,然后将标签更改为Map<String, String>
而不是List<Label>
第二个选项
如果您有多个相同动作的实例,则可以将标签的设计更改为包含两个字段value
和action
{ "update" : {
"labels" : [{"action": "add", "value" : "A label"} ]
}
}
并相应地更新Label
:
public static class Label{
public String action;
public String value
public Label(String action, String value){
this.action = action;
this.value = value;
}
}
您还可以将action
更改为enum
,以定义所有可能的操作
第三种选择
如果您确实需要坚持使用json设计,则没有太多选择来为动态json定义静态类型类。也许有可能使用jackons的多态性来破解此问题。但您始终可以只使用json对象,并将标签保留为List<JsonObject>
答案 1 :(得分:1)
您可以使用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"
} ]
}
另请参阅: