@JsonView:不同的视角
@JsonView: different perspectives
我正在编写 Spring Web 服务,默认情况下使用 Jackson。我正在使用 @JsonView 来指示我需要将哪个 属性 解析为我的 JSON 对象。所以,问题是:许多对象被用于不同的类,但并不完全是它的所有属性,例如:
class Professor {
@JsonView({Views.Public.class, Views.Internal.class})
private int id;
@JsonView(Views.Internal.class)
private String name;
...
}
class Classroom {
@JsonView({Views.Public.class, Views.Internal.class})
private int id;
@JsonView(Views.Internal.class)
private String name;
...
}
class Lecture {
@JsonView(Views.Public.class)
private Professor professor;
@JsonView(Views.Public.class)
private Classroom classroom;
...
}
如果我需要两个以上 'perspectives',我必须创建更多 interfaces/classes 怎么办? (例如 Views.Professor、Views.Principal、...)这是一个真正的好做法吗?
我想听听一些建议或替代方案来解决这个问题。我对走在正确的轨道上有点困惑。
通用名称
如果您需要更多观点,您总是可以定义更多观点,这就是杰克逊JSON观点背后的理念,这就是它灵活的原因。
如果您在视图 类 中使用 通用名称,例如 Basic
、Extended
、Public
、Private
等等,您会发现在多个 bean 中 重用 它们会更容易。
继承
您始终可以依靠 继承 和 @JsonView
。考虑以下示例,其中 Views.Private
扩展 Views.Public
:
public class Views {
interface Public {}
interface Private extends Public {}
}
用 @JsonView(Views.Private.class)
注释的属性的序列化也将包括用 @JsonView(Views.Public.class)
注释的属性。
我正在编写 Spring Web 服务,默认情况下使用 Jackson。我正在使用 @JsonView 来指示我需要将哪个 属性 解析为我的 JSON 对象。所以,问题是:许多对象被用于不同的类,但并不完全是它的所有属性,例如:
class Professor {
@JsonView({Views.Public.class, Views.Internal.class})
private int id;
@JsonView(Views.Internal.class)
private String name;
...
}
class Classroom {
@JsonView({Views.Public.class, Views.Internal.class})
private int id;
@JsonView(Views.Internal.class)
private String name;
...
}
class Lecture {
@JsonView(Views.Public.class)
private Professor professor;
@JsonView(Views.Public.class)
private Classroom classroom;
...
}
如果我需要两个以上 'perspectives',我必须创建更多 interfaces/classes 怎么办? (例如 Views.Professor、Views.Principal、...)这是一个真正的好做法吗?
我想听听一些建议或替代方案来解决这个问题。我对走在正确的轨道上有点困惑。
通用名称
如果您需要更多观点,您总是可以定义更多观点,这就是杰克逊JSON观点背后的理念,这就是它灵活的原因。
如果您在视图 类 中使用 通用名称,例如 Basic
、Extended
、Public
、Private
等等,您会发现在多个 bean 中 重用 它们会更容易。
继承
您始终可以依靠 继承 和 @JsonView
。考虑以下示例,其中 Views.Private
扩展 Views.Public
:
public class Views {
interface Public {}
interface Private extends Public {}
}
用 @JsonView(Views.Private.class)
注释的属性的序列化也将包括用 @JsonView(Views.Public.class)
注释的属性。