我应该能够将org.springframework.data.util.pair
序列化/反序列化为JSON /从JSON。
我有List<Pair<A, B>> myPairList
-我要存储/加载此列表。
序列化是没有问题的;但是,由于此pair
是不可变的,因此没有默认的构造函数,反序列化也会失败。
我知道这里有@JsonCreator
;但是如果我正确的话,我们只能将其放在构造函数上。由于pair
类是最终类,因此无法使用带有@JsonCreator
注释的自己的默认构造函数对其进行扩展。
有人可以指出我,我怎样才能实现自己的目标?我想避免创建自己的包装器类。
答案 0 :(得分:1)
我认为您需要为该属性实现自定义反序列化器,例如此答案https://stackoverflow.com/a/19167145/1905015。您可以在属性上方放置@JsonDeserialize
注释。
答案 1 :(得分:0)
markusw的答案是正确的。为了显示一个真实的例子,这是我最后解决它的方法,以反序列化对列表:
public class MyPairDeserializer extends JsonDeserializer<Pair<MyClassA, MyClassB>> {
static private ObjectMapper objectMapper = null;
@Override
public Pair<MyClassA, MyClassB> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
JsonNode treeNode = jsonParser.getCodec().readTree(jsonParser);
MyClassA first = objectMapper.treeToValue(treeNode.get("first"), MyClassA.class);
MyClassB second = objectMapper.treeToValue(treeNode.get("second"), MyClassB.class);
return Pair.of(first, second);
}
}
...
SimpleModule module = new SimpleModule();
module.addDeserializer(Pair.class, new MyPairDeserializer());
objectMapper.registerModule(module);
List<Pair<MyClassA, MyClassB>> myData = objectMapper.readValue(file..., new TypeReference<List<Pair<Class<MyClassA>, Class<MyClassB>>>>() {
...
请注意反序列化器中嵌入的ObjectMapper
。用于反序列化配对中的“第一”和“第二”。