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

标签 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
    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) ; 
    }
}

当我序列化它时,我只会得到数组部分。

    TryToSerialize tts = new TryToSerialize();
    tts.setNumber(10);
    tts.setWord("Working");
    tts.add("first");
    tts.add("second");
    tts.add("third");
    String json = tts.getAsJSON();

Json:

["first","second","third"]

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

最佳答案

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

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

如果您期望的结果如下:

{"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();
    }
}

如果您期望的结果如下:

[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)

可能有更聪明的方法,但这应该有效......

关于Java 对象使用 Jackson 将列表扩展为 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121594/

相关文章:

c++ - 什么是对象切片?

java - Apache Camel | FTP |仅使用单个文件

java - 将 google-sample-code 从 github 导入到 java 应用程序

c# - HttpWebRequest - 基础连接已关闭 : An unexpected error occurred on a send

swift 3 : The difference between Public and Internal access modifiers?

java - @DiscriminatorColumn 的动态值

java - 在扩展 CrudRepository 的接口(interface)中缓存 Pageable 对象(结果)

java - freemarker 宏参数内的 if-else 语句?

c# - 如何使用 C# 将整个 MongoDB 集合保存到 json/bson 文件?

sql - 我可以在没有源列名成为 SQL Server 2016 键的情况下使用 FOR JSON 吗?