我对对象接口的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"}}}
尽管我在映射中指定了点的序列化类型(@JsonSerialize(as=PointView.class)
),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。
若我从类容器中的方法getMap中删除注释(@JsonSerialize(as=MapView.class)
),我将得到结果
{"map":{"id":"mapId","name":"mapName","point":{"id":"pointId"}}}
现在点没有属性"名称",但地图有。
我怎样才能得到结果
{"map":{"id":"mapId","point":{"id":"pointId"}}}
?
是的,你可以用
@JsonSerialize(as=MyInterface.class)
public class ConcreteClass implements MyInterface { .... }
在实现类上(如上所述),或在有值的属性上。
您可以这样对方法进行注释:
@JsonIgnore
public String getName() {
return name;
}
或者,如果您希望在这个用例中实现特定的序列化,但在其他用例中实现正常的序列化,那么您可以使用@JsonView
(参见文档)。
它序列化名称的原因是实例具有访问器
getName()
,即使接口没有。
为了获得所需的结果,接口中的相同方法也必须由@JsonSerialize
interface MapView {
String getId();
@JsonSerialize(as = PointView.class)
Point getPoint();
}
但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?
我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?
我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。
我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。
主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试
我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中