Damith 是对的,您似乎无法在同一个类中标记这两种方法,但是有一种方法可以解决这个问题:
首先,您必须创建一个自定义反序列化器(或序列化器,取决于您的偏好)。
我的示例对象:
@JsonDeserialize(using = ObjectDeserializer.class)
public class MyObject {
private String name;
public void setName(String name) {
this.name = name;
}
@JsonProperty("SomeOtherName")
public String getName() {
return name;
}
}
注意,我将 getter 标记为具有名字的属性。我给班级一个自定义的反序列化器。看起来像这样:
public class ObjectDeserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
MyObject object = new MyObject();
JsonNode node = jp.getCodec().readTree(jp);
JsonNode jsonNode = node.get("MyCustomSerializeName");
object.setName(jsonNode.getTextValue());
return object;
}
}
该类将创建我的自定义对象并获取设置器字段描述的名称(而不是依赖于属性名称)。
放在一起,我得到:
public class DeserializeTest {
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
MyObject o = new MyObject();
o.setName("Hello");
String writeValueAsString = mapper.writeValueAsString(o);
System.out.println(writeValueAsString);
String jsonObj = "{\"MyCustomSerializeName\":\"Other Test\"}";
MyObject readValue = mapper.readValue(jsonObj, MyObject.class);
System.out.println(readValue.getName());
}
}
这个输出:
{"SomeOtherName":"Hello"}
Other Test
希望对你有所帮助。