使用Jackson反序列化具有不同配置的父/子类

sczxawaw  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(157)

我正在使用Sping Boot 开发一个Restful应用程序,我已经定义了如下的类:

class Organization {
    String name;
}

class Base {
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    Organization org;
}

class Car extends Base{
  //other members
}

class FlattenCar extends Car {
    @JsonUnwrapped(prefix = "org_")
    Organization org;
}

现在发生的事情是,反序列化org对象取决于第一次调用。这意味着,如果我第一次反序列化Car,接下来对反序列化FlattenCar的调用不会解包org,反之亦然。我知道我隐藏了org成员,但似乎第一次反序列化被缓存了!谁知道问题出在哪里,我该如何解决它?

f4t66c6m

f4t66c6m1#

你的问题似乎是,在你的Base类中有选项READ_ONLY(仅用于序列化),当它应该是WRITE_ONLY时,如果只想在反序列化中考虑这个属性。
READ_ONLY:存取设定,表示只能读取属性以进行序列化,但不能在还原序列化期间写入(设定)。
WRITE_ONLY:存取设定,表示只能针对还原序列化写入(设定)属性,但无法在序列化时读取(取得),也就是说,属性的值不包含在序列化中。

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@RestController
public class API {

    @Data
    public static class Organization {
        private String name;
    }

    @Data
    public static class Base {
        @JsonProperty(access = Access.WRITE_ONLY)
        private Organization org;
    }

    @Getter @Setter
    public static class Car extends Base {
        private String prop1;
    };

    @Getter @Setter
    public static class FlattenCar extends Car { 
        private String prop2;
    };

    @PostMapping("/car")
    public Car deserializeCar(@RequestBody Car car) {
        System.out.println("Car: " + car);
        return car;
    }

    @PostMapping("/flatten_car")
    public FlattenCar deserializeFlattenCar(@RequestBody FlattenCar flattenCar) {
        System.out.println("Flatten: " + flattenCar);
        return flattenCar;
    }

}

输出:

Flatten: API.Base(org=API.Organization(name=Org. Test))
Car: API.Base(org=API.Organization(name=Org. Test))

请记住,在本例中,Car/CarFlatten类的to_string方法是从基类继承的。

相关问题