Java对象使用Jackson将列表扩展为Json
我想使用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
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)