gpt4 book ai didi

java - 如何使用 Jackson 指定要序列化为 JSON 的特定字段?

转载 作者:行者123 更新时间:2023-12-02 01:27:21 26 4
gpt4 key购买 nike

我有两个类 Athlete 和 Injury,最后一个类包含 Athlete 对象,当序列化发生时,我会得到以下 JSON 表示形式:{"id":X,"kindOfInjury":"...","muscle":"...","side":"...","outOfTrainig":Y,"injuryDate": "2018-Jun-02","运动员":{"id":X,"名字":"...","姓氏":"...","年龄":X,"电子邮件":"..."}}

我不想获取有关运动员的所有信息 - 只是一个 id 值,例如 "athleteId":1,而不是获取整个对象表示形式。

所以,我发现我需要应用我的自定义序列化器,它在 Injury 类上实现 StdSerializer。这就是我到目前为止得到的:

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)你能给我推荐一些关于 jackson 的书吗?因为此时我的脑子里对此有点困惑?

感谢您的耐心等待,期待您的回复:)

最佳答案

您可以使用数据传输对象 (DTO) 来实现此目的。

创建一个简单的 POJO,如下所示:

public class InjuryDTO {

//all other required fields from Injury model...

@JsonProperty("athlete_id")
private Long athleteId;
}

以及它的转换器:

@Component
public class InjuryToDTOConverter{

public InjuryDTO convert(Injury source){
InjuryDTO target = new InjuryDTO();
BeanUtils.copyProperties(source, target); //it will copy fields with the same names
target.setAthleteId(source.getAthlete().getId());
return target;
}
}

你可以这样使用它:

@RestController("/injuries")
public class InjuryController {

@Autowired
private InjuryToDTOConverter converter;

@Autowired
private InjuryService injuryService;

@GetMapping
public InjuryDTO getInjury(){
Injury injury = injuryService.getInjury();
return converter.convert(injury);
}
}

这种方法的好处是您可以为不同的目的拥有多个 DTO。

关于java - 如何使用 Jackson 指定要序列化为 JSON 的特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56711014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com