6

我有一个像

{
    "key" : ["key1", "key2", "key3"],
    "value" : "v1";
}

我正在Pojo使用杰克逊将它反序列化到我的班级,在反序列化时,我希望变量valueList<String>其大小取决于变量大小的类型key。所以最终的对象将代表这个 Json。

{
     "key" : ["key1", "key2", "key3"],
     "value" : ["v1", "v1", "v1"];
}

到目前为止我的Pojo课是这样的

public class Pojo {

@JsonProperty("key")
private List<String> key;
@JsonProperty("value")
private List<String> value;

@JsonProperty("key")
public List<String> getKey() {
    return key;
}

@JsonProperty("key")
public void setKey(List<String> key) {
    this.key = key;
}

@JsonProperty("value")
public List<String> getValue() {
    return value;
}

@JsonProperty("value")
public void setValue(String val) {
    List<String> arr = new ArrayList<String>();
    for (int i=0; i<key.size(); i++) {
        arr.add(val);
    }
    this.value = arr;
}

}

但我得到了JsonMappingException。在调试时我发现 setValue 方法变量内部keynull. 有没有办法先设置变量的值key?(在变量之前value

4

2 回答 2

1

您应该在自定义反序列化器类中隐藏这种丑陋的转换。它可能看起来像这样:

class PojoJsonDeserializer extends JsonDeserializer<Pojo> {

    @Override
    public Pojo deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        InnerPojo innerPojo = jp.readValueAs(InnerPojo.class);

        return innerPojo.toPojo();
    }

    private static class InnerPojo {
        public List<String> key;
        public String value;

        Pojo toPojo() {
            Pojo pojo = new Pojo();
            pojo.setKey(new ArrayList<String>(key));
            pojo.setValue(valueNTimes(value, key.size()));

            return pojo;
        }

        private List<String> valueNTimes(String value, int nTimes) {
            List<String> result = new ArrayList<String>(nTimes);
            for (int index = 0; index < nTimes; index++) {
                result.add(value);
            }

            return result;
        }
    }
}

您的 POJO 类现在看起来“自然”了:

@JsonDeserialize(using = PojoJsonDeserializer.class)
class Pojo {

    private List<String> key;
    private List<String> value;

    public List<String> getKey() {
        return key;
    }

    public void setKey(List<String> key) {
        this.key = key;
    }

    public List<String> getValue() {
        return value;
    }

    public void setValue(List<String> value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Pojo [key=" + key + ", value=" + value + "]";
    }
}

简单的测试程序:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(json, Pojo.class));
    }
}

印刷:

Pojo [key=[key1, key2, key3], value=[v1, v1, v1]]
于 2013-10-03T19:32:51.347 回答
0

Setter 不应该在 Pojo 上执行计算来避免此类问题。

您可以编写另一个只存储值的类。反序列化后,您必须将它们映射到损坏的类,并确保按所需顺序调用设置器。

于 2013-10-03T10:33:57.487 回答