java - 用 jackson 反序列化扩展ArrayList的Java对象

原文 标签 java json inheritance jackson unmarshalling

我有以下类,可以按照自己想要的方式进行序列化。

@JsonSerialize(using = MySerializer.class)
@JsonDeserialize(using = MyDeserialize.class)
public class TryToSerialize extends ArrayList<String>
{
    private int number;
    private String word;
    public TryToSerialize(){}
    public TryToSerialize(int number, String word){
        this.number = number;
        this.word = word;
    }

    @JsonProperty
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
    @JsonProperty
    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }
}


已使用以下序列化器序列化

class MySerializer extends JsonSerializer<TryToSerialize> 
{
    @Override
    public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException 
    {
       jgen.writeStartObject();
        jgen.writeNumberField("number", toSerialize.getNumber());
        jgen.writeStringField("word", toSerialize.getWord());
        provider.defaultSerializeField("values", toSerialize.iterator(), jgen);
        jgen.writeEndObject();
    }
}


此代码会将对象序列化为以下内容:

{"number":10,"word":"Working","values":["first","second","third"]}


现在,我正在尝试对其进行反序列化,但是我不确定如何处理ArrayList部分。到目前为止,我有这样的事情:

class MyDeserialize extends JsonDeserializer<TryToSerialize> {
    @Override
    public TryToSerialize deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        int number = (Integer) ((IntNode) node.get("number")).numberValue();
        String word = node.get("word").asText();


        return new TryToSerialize(number, word);
    }
}


任何帮助将不胜感激。

最佳答案

到目前为止,您可以使用的一个选项是,因为有了JsonNode可用,并且您知道已将列表序列化到属性values中,以遍历values属性并将内容添加到类中。

class MyDeserializer extends JsonDeserializer<TryToSerialize> {
    @Override
    public TryToSerialize deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        int number = (Integer) ((IntNode) node.get("number")).getNumberValue();
        String word = node.get("word").asText();

        TryToSerialize deserialized = new TryToSerialize(number, word);
        JsonNode valuesNode = node.get("values");
        if (valuesNode.isArray()) {
            Iterator<JsonNode> arrayIterator = ((ArrayNode) valuesNode).getElements();
            while (arrayIterator.hasNext()) {
                deserialized.add(arrayIterator.next().getTextValue());
            }

        }

        return deserialized;
    }
}

关于java - 用 jackson 反序列化扩展ArrayList的Java对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129695/

相关文章:

java - 没有等待线程的信号状态

java - 根据最佳实践,我应该将用于 GUI 测量的 JavaFX 常量放在哪里?

java - ReSTLet:所有500个错误的日志堆栈跟踪

asp.net-mvc - 防止在模型中继承验证属性

inheritance - Ember-CLI 扩展自定义路由(作为基础 "class")

java - 在Excel中用相同的颜色填充整个工作表-Apache POI

javascript - 如何遍历通过 AJAX JSON 发送的对象

python - 如何从python脚本读取json文件中的列表

安卓 : upload Image and JSON using MultiPartEntityBuilder

c++ - C++继承维度计算器程序错误: “function call missing argument list”