【问题标题】:Use jackson annotation JsonUnwrapped on a field with name different from its getter在名称与其 getter 不同的字段上使用杰克逊注解 JsonUnwrapped
【发布时间】:2018-02-16 23:22:43
【问题描述】:

我有这样的课:

class Car {
    private Engine myEngine;

    @JsonProperty("color")
    private String myColor;  

    @JsonProperty("maxspeed")
    private int myMaxspeed;

    @JsonGetter("color")
    public String getColor()
    {
        return myColor;
    }

    @JsonGetter("maxspeed")
    public String getMaxspeed()
    {
        return myMaxspeed;
    }

    public Engine getEngine()
    {
        return myEngine;
    }
}

和引擎类类似

class Engine {
    @JsonProperty("fueltype")
    private String myFueltype;

    @JsonProperty("enginetype")
    private String myEnginetype;

    @JsonGetter("fueltype")
    public String getFueltype()
    {
        return myFueltype;
    }

    @JsonGetter("enginetype")
    public String getEnginetype()
    {
        return myEnginetype;
    }
}

我想使用 Jackson 将 Car 对象转换为 JSON,其结构类似于

'car': {
   'color': 'red',
   'maxspeed': '200',
   'fueltype': 'diesel',
   'enginetype': 'four-stroke'
 } 

我已经尝试过this 中提供的答案,但它对我不起作用,因为字段名称与 getter 不同

我知道如果字段名称是引擎,我可以在引擎上使用 @JsonUnwrapped。但是这种情况怎么办。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    同时提供@JsonUnwrapped@JsonProperty

    @JsonUnwrapped
    @JsonProperty("engine")
    private Engine myEngine;
    

    【讨论】:

      【解决方案2】:

      您应在 Car 类中使用 @JsonUnwrapped,如下所示:

      class Car {
      
          @JsonUnwrapped
          private Engine myEngine;
      
          @JsonProperty("color")
          private String myColor;  
      
          @JsonProperty("maxspeed")
          private int myMaxspeed;
          ...
      

      【讨论】:

      • 感谢您的快速回答,但这不起作用。它在 json 中创建一个引擎对象
      【解决方案3】:

      我认为这里最好的解决方案是在myEngineType 类中的myEngineType 属性上使用@JsonValue 注释,它只会序列化这个属性而不是整个Engine 对象。

      所以你的代码会是这样的:

      class Engine {
      
          @JsonProperty("fueltype")
          private String myFueltype;
      
          @JsonValue
          @JsonProperty("enginetype")
          private String myEnginetype;
      
      }
      

      您可以查看this answer了解更多详情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        相关资源
        最近更新 更多