在同一个JSON

时间:2015-08-19 08:25:49

标签: json jackson

给出这样的枚举:

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属性中深入序列化。

我怎么能这样做?

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用了以下解决方案。

  1. 将Planet枚举注释如下:
  2. http://localhost:3000/index.html

    默认情况下,枚举器由Jackson序列化为String(常量名称),但是使用此注释,Jackson将为我们提供深度枚举结构。

    1. 带注释的属性getters
    2. @JsonFormat(shape = JsonFormat.Shape.OBJECT)
      public enum Planet{
          /* skipped */
      }
      

      这里我们重写序列化枚举作为对象,并要求杰克逊简单地给我们一个枚举的常量名称。

      1. 最后,但并非最不重要的是,将public class Route{ /* skipped */ @JsonFormat(shape = JsonFormat.Shape.STRING) public Planet getFrom(){/*...*/} @JsonFormat(shape = JsonFormat.Shape.STRING) public Planet getTo(){/*...*/} } 添加到Planet枚号:
      2. 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所示,枚举常量名称为键。