【发布时间】:2019-06-21 22:16:09
【问题描述】:
我有两个类 Athlete 和 Injury,最后一个包含 Athlete 对象,当序列化发生时,我得到以下 JSON 表示形式:
{"id":X,"kindOfInjury":"...","muscle":"...","side":"...","outOfTrainig":Y,"injuryDate":"2018-Jun-02","athlete":{"id":X,"firstName":"...","lastName":"...","age":X,"email":"..."}}
我不想获取有关 Athlete 的所有信息 - 只是一个 id 值,例如 "athleteId":1,而不是获取整个对象表示。
所以,我发现我需要在 Injury 类上应用实现 StdSerializer 的自定义 Serializer。所以这就是我到目前为止得到的:
class InjurySerializer extends StdSerializer<Injury> {
public InjurySerializer() {
this(null);
}
public InjurySerializer(Class<Injury> i) {
super(i);
}
@Override
public void serialize(
Injury value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.getId());
jgen.writeStringField("kindOfInjury", value.getKindOfInjury());
jgen.writeStringField("muscle", value.getMuscle());
jgen.writeStringField("side", value.getSide());
jgen.writeNumberField("outOfTraining", value.getOutOfTraining());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd");
Date date = new Date();
String ourformat = formatter.format(date.getTime());
jgen.writeStringField("injuryDate", ourformat);
jgen.writeNumberField("athleteId", value.getAthlete().getId());
jgen.writeEndObject();
}
}
以及实际的伤害等级:
@Entity
@Table(name = "INJURY")
@JsonSerialize(using = InjurySerializer.class)
public class Injury {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "INJURY_ID")
private Long id;
@Column(name = "KIND_OF_INJURY")
private String kindOfInjury;
@Column(name = "MUSCLE")
private String muscle;
@Column(name = "SIDE")
private String side;
@Column(name = "OUT_OF_TRAINING")
private Integer outOfTraining;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MMM-dd")
@Column(name = "INJURY_DATE")
private Date injuryDate;
@ManyToOne
@JoinColumn(name = "ATHLETE_ID")
private Athlete athlete;
所以,这个解决方案有效,但看起来很糟糕......
问题如下: 1) 是否有任何机制可以为我提供仅更改我真正需要的一个属性的序列化的功能,而不是编写所有这些繁琐的代码,而实际更改仅在这一行中? :
jgen.writeNumberField("athleteId", value.getAthlete().getId());
2) 你能推荐我读一些关于杰克逊的东西吗?因为此时我脑子里有点乱?
感谢您的耐心等待,期待您的回复:)
【问题讨论】:
-
您可以使用属性“JsonIgnore”,这里有更多信息:Jackson DOCs。我建议你关注 baeldung 教程,这里有一些有用的链接: 1. baeldung.com/jackson 2. baeldung.com/jackson-ignore-properties-on-serialization
-
是的,我之前查过,但是问题是,如果我在Injury类中将Athlete字段标记为@JsonIgnore,那么我就不能再使用这个字段了,所以整个序列化Injury 类中的运动员对象将被阻止 -> 这不是我想要的,我希望从运动员属性中只有一个属性序列化 -> 只是 id 字段。