【发布时间】:2015-03-18 21:31:54
【问题描述】:
在我使用 Spring 的 Web 应用程序中,我们希望使用自定义 JSON 结构。 Spring 默认采用这样的 POJO:
public class Model {
private int id;
private String name;
public Model(){}
public Model(int id, String name){
this.id = id;
this.name = name;
}
}
把它变成这样:
{"id":1, "name":"Bob"}
对于我们的应用程序,我们希望将其变成这样:
[1, "Bob"]
我想使用 Spring 的默认序列化逻辑来检测 Java 类型(int、String、Collection 等)并映射到适当的 JSON 类型,但只需将包装对象更改为数组而不是对象和字段。
这是我目前拥有的序列化器(将在模型中使用 @JsonSerialize(using = Serializer.class) 实现),但不希望重写 Spring 已经实现的所有逻辑。
public class Serializer extends JsonSerializer<Model> {
@Override
public void serialize(Model value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartArray();
jgen.writeString(value.id);
.... other values ...
jgen.writeEndArray();
}
}
如何连接到预先存在的序列化程序,以便这个新的序列化程序可以像默认的那样与任何 POJO 一起工作(不仅仅是 Model 类,还有我们需要序列化到数组的任何类似或子类)?这可能具有混合属性,并且没有特定的属性命名约定。
我想避免为每个不同的模型类(...其他值...)部分编写自定义序列化程序。
【问题讨论】:
-
序列化器是正确的做法。
-
所以不是
{"id":1},而是[1],而不是{"id":[1]}? -
我认为您找不到通用的方法来执行此操作。这是一个非常具体的要求(我建议反对)。没有杰克逊注释会给你这种行为。至于序列化程序,您需要为每种类型编写一个不同的序列化程序,假设类型的字段不同。
-
对,默认值非常具体。数组或
Collection类型被序列化为 JSON 数组。String被序列化为 JSON 字符串,Number类型被序列化为 JSON 数字,null被序列化为 JSON null,其他引用类型被序列化为 JSON 对象。您正在尝试将引用类型 (Model) 序列化为具有单个元素的 JSON 数组。这是非常不标准的。 -
嵌套 POJO 怎么样?这些将如何序列化?
标签: java json spring spring-mvc serialization