如何处理Jackson中的向后兼容性(字段名称更改)



假设我使用库中的模式(不属于我(

class OldClass {
int id;
string name;
}

串行化JSON";SerJsonStr";想要

{"id": 12, "name": "Bob"}

现在我可以使用";OldClass";schema和上面的示例json将json取消序列化为scala对象

OldClass obj = new ObjectMapper().readValue[OldClass](SerJsonStr)

但是,假设库将模式(通过更改字段名(更新为

class OldClass {
int id;
string **fullName**;
}

现在,为了向后兼容,取消序列化将fullName设置为null。注意,";OldClass";是非我所有的第三方库的一部分

有没有任何方法可以明确指定Map["名称"-"全名"],然后指定

customizedFieldNameChange["name"] = "fullName"
OldClass obj = new ObjectMapper().readValue[OldClass]({"id": 12, "name": "Bob"}, customizedFieldNameChange)

将fullName设置为";Bob"(即它将在"上调用setFullName((;obj";对于";name";json字符串中的字段(?

您必须使用JsonDeserializer从json中动态读取值。

下面是一个Java示例,

public class CustomDeserializer extends JsonDeserializer<OldClass> {
@Override
public OldClass deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException, JsonProcessingException {
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
int id = (Integer) ((IntNode) node.get("id")).numberValue();
String fullName = node.get("name").asText();
return new OldClass(id, fullName);
}
}

最后,为了反序列化

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(OldClass.class, new CustomDeserializer());
mapper.registerModule(module);
OldClass values = mapper.readValue(json, OldClass.class);

有关详细解释,请查看本教程