春季休息Json问题

时间:2015-05-05 06:47:30

标签: spring rest jackson

我在下面找到了回答的问题

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

中不起作用

2 个答案:

答案 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

我希望能帮到你。