给出这样的枚举:
public enum Planet{
MERCURY ("Mercury", 0.4),
VENUS ("Venus", 0.7),
EARTH ("Earth", 1.0),
MARS ("Mars", 1.5);
private final String name;
private final double distance;
Planet(String name, double distance, double mass){
this.name = name;
this.distance = distance;
}
public String getName(){
return name;
}
public double getDistance(){
return distance;
}
}
...以及将此枚举作为属性的类:
public class Route{
private Planet from;
private Planet to;
public Route (Planet from, Planet to){
this.from = from;
this.to = to;
}
public Planet getFrom(){
return from;
}
public Planet getTo(){
return to;
}
}
使用Jackson将其序列化为JSON的正确方法是什么,以便生成的JSON包含这样的深和浅行星枚举:
{
"planets":{
"MERCURY":{
"name":"Mercury",
"distance":"0,4"
},
...
},
"route":{
"from":"EARTH",
"to":"MARS"
}
}
首先,为了获得深枚举结构,我使用@JsonFormat(shape = JsonFormat.Shape.OBJECT)
对其进行注释,但随后它也会在route
属性中深入序列化。
我怎么能这样做?
谢谢!
答案 0 :(得分:0)
我使用了以下解决方案。
http://localhost:3000/index.html
默认情况下,枚举器由Jackson序列化为String(常量名称),但是使用此注释,Jackson将为我们提供深度枚举结构。
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Planet{
/* skipped */
}
这里我们重写序列化枚举作为对象,并要求杰克逊简单地给我们一个枚举的常量名称。
public class Route{
/* skipped */
@JsonFormat(shape = JsonFormat.Shape.STRING)
public Planet getFrom(){/*...*/}
@JsonFormat(shape = JsonFormat.Shape.STRING)
public Planet getTo(){/*...*/}
}
添加到Planet枚号:Map<String, Planet>
在Planet enum中引入静态地图允许我们将此地图传递给Jackson JSON序列化程序并获取public enum Planet {
/*skipped*/
private static Map<String, Planet> planetsMap;
static {
planetMap = new HashMap<>();
for (Planet planet : Planet.values()) {
planetMap.put(planet.name(), planet);
}
}
public static Map<String,Planet> getPlanets(){
return new HashMap<>(planetsMap);
}
}
属性,如上面的JSON所示,枚举常量名称为键。