我对jackson通过接口序列化对象有问题。
我有课
class Point implements PointView {
private String id;
private String name;
public Point() {
}
public Point(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String getId() {
return id;
}
public String getName() {
return name;
}
}它实现了
interface PointView {
String getId();
}并且有课
class Map implements MapView {
private String id;
private String name;
private Point point;
public Map() {
}
public Map(String id, String name, Point point) {
this.id = id;
this.name = name;
this.point = point;
}
@Override
public String getId() {
return id;
}
public String getName() {
return name;
}
@JsonSerialize(as = PointView.class)
public Point getPoint() {
return point;
}
}它实现了
interface MapView {
String getId();
Point getPoint();
}并且有课
class Container {
private Map map;
public Container() {
}
public Container(Map map) {
this.map = map;
}
@JsonSerialize(as = MapView.class)
public Map getMap() {
return map;
}
}我想用Jackson序列化Container并获得结果
{"map":{"id":"mapId","point":{"id":"pointId"}}}但实际上我得到了结果
{"map":{"id":"mapId","point":{"id":"pointId","name":"pointName"}}}它们在嵌套对象" Point“中具有属性"name”,尽管我将序列化类型指定为“映射中的点”(@JsonSerialize(as = PointView.class))。接口PointView没有方法getName,但在结果中存在点的字段"name“。
如果我从类容器中的方法getMap中删除注释(@JsonSerialize(as = MapView.class)),我会得到结果
{"map":{"id":"mapId","name":"mapName","point":{"id":"pointId"}}}现在点没有属性"name",但是map有。
怎样才能得到结果
{"map":{"id":"mapId","point":{"id":"pointId"}}}发布于 2015-10-17 03:12:39
为了获得所需的结果,接口中的相同方法也必须由@JsonSerialize注释
interface MapView {
String getId();
@JsonSerialize(as = PointView.class)
Point getPoint();
}发布于 2015-10-16 15:28:40
您可以像这样注释该方法:
@JsonIgnore
public String getName() {
return name;
}或者,如果在此用例中需要特定的序列化,而在其他用例中需要正常的序列化,则可以使用@JsonView (请参阅doc)。
它序列化name的原因是实例有访问器getName(),即使接口没有。
发布于 2015-10-17 00:49:42
是的,您可以使用
@JsonSerialize(as=MyInterface.class)
public class ConcreteClass implements MyInterface { .... }在实现类上(如上所述),或者在有值的属性上。
https://stackoverflow.com/questions/33151974
复制相似问题