我在下面找到了回答的问题
Different names of JSON property during serialization and deserialization
不幸的是,当我们使用Spring Restful webservice时,这不起作用。我不确定是什么引起了这个问题,但它给出了一些Field abiguity异常。
我想要做的是使用不同的名称序列化和反序列化字段名称。
例如
class Test {
private String name;
@JsonProperty("myName")
public String getName() {
return name;
}
@JsonProperty("yourName")
public void setName(String name) {
this.name = name;
}
}
这在Spring rest
中不起作用答案 0 :(得分:1)
你不能为两者设置@JsonProperty(getter& setter)。您可以设置字段或setter方法。
但是你需要不同的请求和响应名称,创建这样的两个类。
class StudentResponse{
@JsonProperty(name="student_name)
private String name;
//getter & setter
}
class StudentRequest{
@JsonProperty(name="name)
private String name;
//getter & setter
}
答案 1 :(得分:0)
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;
}
}
此类将创建我的自定义对象并获取setter字段描述的名称(而不是依赖于属性名称)。
放在一起,我得到:
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
我希望能帮到你。