Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象使用Jackson将列表扩展为Json_Java_Json_Inheritance_Jackson_Marshalling - Fatal编程技术网

Java对象使用Jackson将列表扩展为Json

Java对象使用Jackson将列表扩展为Json,java,json,inheritance,jackson,marshalling,Java,Json,Inheritance,Jackson,Marshalling,我想使用Jackson将一个正在扩展列表的对象转换为Json。 例如: public class TryToSerialize extends ArrayList<String> { private int number; private String word; public TryToSerialize(){ number = 0; word = ""; } @JsonProperty publi

我想使用Jackson将一个正在扩展列表的对象转换为Json。 例如:

public class TryToSerialize extends ArrayList<String>
{
    private int number;
    private String word;

    public TryToSerialize(){
        number = 0;
        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;
    }

    @JsonIgnore
    public String getAsJSON() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(new File("c:\\tts.json"), this);
        return mapper.writeValueAsString(this) ; 
    }
}
Json:


我正在寻找一种方法来包含对象的其他变量。

当对象扩展存在默认序列化行为的一个类时,您的额外字段将被忽略

现在,有一件事我还不清楚,那就是预期的结果应该是什么

如果您希望得到以下结果:

{"number":10,"word":"Working","values":["first","second","third"]}
然后,您应该能够通过自定义序列化程序完成此操作,如以下所示:

public 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();
    }
}
然后,序列化程序将如下所示:

public class MySerializer extends JsonSerializer<TryToSerialize> {
    @Override
    public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartArray();
        jgen.writeNumber(toSerialize.getNumber());
        jgen.writeString(toSerialize.getWord());
        for (Iterator<String> iterator = toSerialize.iterator(); iterator.hasNext();) {
            jgen.writeString((String) iterator.next());         
        }
        jgen.writeEndArray();
    }
}

也许有更聪明的方法,但这应该有效

真是太棒了。您知道如何反序列化它吗?您需要一个自定义反序列化程序;)然而,如果您修改了TryToSerialize类,使其委托给ArrayList而不是从ArrayList继承,这不是更好的设计吗?(如果上述两个输出中的第一个是可接受的)。这将使用默认(反)序列化程序(反)序列化。
public 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();
    }
}
[10,"Working","first","second","third"]
public class MySerializer extends JsonSerializer<TryToSerialize> {
    @Override
    public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartArray();
        jgen.writeNumber(toSerialize.getNumber());
        jgen.writeString(toSerialize.getWord());
        for (Iterator<String> iterator = toSerialize.iterator(); iterator.hasNext();) {
            jgen.writeString((String) iterator.next());         
        }
        jgen.writeEndArray();
    }
}
@JsonSerialize(using = MySerializer.class)