我有一個vehicle這樣定義的Java類:
public final class Vehicle {
private Integer id;
private String description;
private Location start;
private Location end;
private List<Integer> capacity;
private List<Integer> skills;
private TimeWindow timeWindow;
private List<Break> breaks;
public Vehicle(Integer id, String description, Location start,
Location end, List<Integer> capacity,
List<Integer> skills, TimeWindow timeWindow,
List<Break> breaks) {
this.id = id;
this.description = description;
this.start = start;
this.end = end;
this.capacity = capacity;
this.skills = skills;
this.timeWindow = timeWindow;
this.breaks = breaks;
}
TimeWindow定義如下:
public final class Location {
private final Double latitude;
private final Double longitude;
public Location(Double latitude, Double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
現在,我得到的 JSON 沒有為位置(和)定義latitude和;此資訊僅編碼為一個陣列,請參見:longitudestartend
// vehicle.json
{
"id" : 0,
"description" : "vehicle 0",
"start" : [
12.304373066846503,
51.62270653765847
],
"end" : [
12.304373066846503,
51.62270653765847
],
"capacity" : [
9
],
"skills" : [
],
"time_window" : [
1644188400,
1644274800
],
"breaks" : [
]
}
在這種情況下,我該如何撰寫一個自定義反序列化器Location(與 相同的問題TimeWindow)?如果可能,我不想為整個Vehicle班級撰寫自定義反序列化器。
我試過這個:
@JsonDeserialize(
using = LocationJsonDeserializer.class
)
public final class Location {
// ....
public class LocationJsonDeserializer extends JsonDeserializer<Location> {
@Override
public Location deserialize(JsonParser p, DeserializationContext ctxt) {
final var longitude = 0d;
final var latitude = 0d;
// what to do here?
return new Location(latitude, longitude);
}
在我看來,我將整個Vehicle傳遞到我的deserialize方法中,而不僅僅是Location部分。我在這里做錯了嗎?這種方法使用杰克遜可行嗎?
uj5u.com熱心網友回復:
您可以Vehicle使用@JsonCreator標記和Double[]用于引數的類start和end. 您還需要@JsonProperty為每個引數添加標簽。
這是一個示例,為簡單起見,我沒有包含引數time_window和breaks.
@JsonCreator
public Vehicle(@JsonProperty("id") Integer id,
@JsonProperty("description") String description,
@JsonProperty("start") Double[] start,
@JsonProperty("end") Double[] end,
@JsonProperty("capacity") List<Integer> capacity,
@JsonProperty("skills") List<Integer> skills) {
this(id, description, new Location(start[0], start[1]),
new Location(end[0], end[1]), capacity, skills);
}
使用json不帶引數的問題中的time_window和進行測驗breaks:
String result = "{\"id\":0,\"description\":\"vehicle 0\",\"start\":[12.304373066846503,51.62270653765847],\"end\":[12.304373066846503,51.62270653765847],\"capacity\":[9],\"skills\":[]}";
ObjectMapper mapper = new ObjectMapper();
Vehicle vehicle = mapper.readValue(result, Vehicle.class);
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(vehicle);
System.out.println(json);
輸出:
{
"id" : 0,
"description" : "vehicle 0",
"start" : {
"latitude" : 12.304373066846503,
"longitude" : 51.62270653765847
},
"end" : {
"latitude" : 12.304373066846503,
"longitude" : 51.62270653765847
},
"capacity" : [ 9 ],
"skills" : [ ]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/438173.html
上一篇:從多維陣列中洗掉空值?
