假设您的 HashMap 的密钥也在您的值对象中(例如汽车的 VIN),因此您以后可以轻松地重新构建密钥,那么注释 @JsonGetter/@JsonSetter 可能会有所帮助:
假设您有一个汽车租赁站之类的东西:
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CarRentalStation {
private String location = "Atlanta";
private Map<String, Car> cars = new HashMap<String, Car> (){{
put("A123", new Car("A123", "BMW 120d"));
put("B321", new Car("B321", "Volkswagen Golf 2.0 TDI"));
}};
public String getLocation() {
return location;
}
@JsonGetter("cars")
public List<Car> getCarsAsList() {
return cars.values().stream().collect(Collectors.<Car>toList());
}
@JsonSetter("cars")
public void setCarsAsList(List<Car> cars) {
Map<String, Car> deserializedCars = cars.stream().collect(Collectors.toMap(Car::getVin, car -> car));
this.cars = deserializedCars;
}
//toString ...
}
这辆车是这样的:
public class Car {
private String vin;
private String model;
Car() {
}
public Car(String vin, String model) {
this.vin = vin;
this.model = model;
}
public String getVin() {
return vin;
}
public String getModel() {
return model;
}
// toString ...
}
您可以轻松地对其进行序列化/反序列化:
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(new CarRentalStation());
System.out.println(json);
// prints: {"location":"Atlanta","cars":[{"vin":"B321","model":"Volkswagen Golf 2.0 TDI"},{"vin":"A123","model":"BMW 120d"}]}
CarRentalStation deserializedCarRentalStation = om.readValue(json, CarRentalStation.class);
System.out.println(deserializedCarRentalStation.toString());
// prints: CarRentalStation{location='Atlanta', cars={B321=Car{vin='B321', model='Volkswagen Golf 2.0 TDI'}, A123=Car{vin='A123', model='BMW 120d'}}}