使用 jackson 映射器有选择地将 JSON 数据的一部分映射到嵌套的 class

Selectively map a part of JSON data to nested class using jackson mapper

我正在尝试使用 jackson 映射器将 JSON 数据映射到 Java Class。虽然我的 JSON 数据是一个平面对象,没有嵌套,但我想 将部分数据映射到其内部 Class

为了说明我的观点,如果您查看下面的 JSON 数据,security_namemarket_cap 字段直接映射到 Security class。 但是 1_month_profit3_month_profit6_month_profit 字段需要映射到内部 class - Profit class(例如 1_month_profitprivate Double oneMonthProfit 的利润 class。

目前,当我反序列化 JSON 数据时,我拥有父 class(安全)变量的所有正确映射,但是 子 class (Profit) 变量未被赋值

反序列化数据的快照:

{ 
  "security_name": "Apple", 
  "market_cap": 13,000,000,000,  
  "profit": { 
     "1_month_profit": null, // <-- not being assigned.. 
     "3_month_profit": null, // <-- not being assigned.. 
     "6_month_profit": null  // <-- not being assigned.. 
   },
  ...   
 } 

我的JSON数据如下:

{ 
  "security_name": "Apple", 
  "market_cap": 13,000,000,000,  
  "1_month_profit": 1.2, 
  "3_month_profit": -2.0, 
  "6_month_profit": 3.0 
      ...
 } 

安全class映射整个JSON数据如下:

public class Security {
   private String securityName;
   private Integer marketCap; 
   private Profit profit = new Profit();

   public String getSecurityName() { 
     return securityName; 
   } 

   @JsonProperty("security_name") 
   public void setSecurityName(String securityName) { 
     this.securityName = securityName; 
   }

   public Integer getMarketCap() { 
     return marketCap; 
   }

   @JsonProperty("market_cap") 
   public void setMarketCap(String marketCap) { 
     this.marketCap= marketCap; 
   }

   @JsonProperty("profit")
   public Profit getProfit() { 
     return profit; 
   }

   public class Profit {
     private Double oneMonthProfit;
     private Double threeMonthProfit;
     private Double sixMonthProfit;

     public Double getOneMonthProfit() {
       return oneMonthProfit;
     }

     @JsonProperty("1_month_profit") // <-- this has no effect. 
     public void setOneMonthProfit(Double oneMonthProfit) {
       this.oneMonthProfit = oneMonthProfit;
     }


     public Double getThreeMonthProfit() {
       return threeMonthProfit;
     }

     @JsonProperty("3_month_profit")
     public void setThreeMonthProfit(Double threeMonthProfit) {
       this.threeMonthProfit = threeMonthProfit;
     }


     public Double getSixMonthProfit() {
       return sixMonthProfit;
     }

     @JsonProperty("6_month_profit")
     public void setSixMonthProfit(Double sixMonthProfit) {
       this.sixMonthProfit = sixMonthProfit;
     }
   } 
}

我希望在内部 Class 中添加 @JsonProperty 注释可以解决问题,但不幸的是这没有任何效果。

我觉得一定有办法使用 jackson mapper 来做到这一点,但我还没有找到实现它的方法。非常感谢您的帮助!预先感谢。

您可以在 Security class 本身上创建相应的设置器,将其映射到嵌套的 Profit 对象。

这是 SecurityProfit 的修改后的 classes。

class Security {
    private String securityName;
    private Integer marketCap;
    private Profit profit = new Profit();

    public String getSecurityName() {
        return securityName;
    }

    @JsonProperty("security_name")
    public void setSecurityName(String securityName) {
        this.securityName = securityName;
    }

    public Integer getMarketCap() {
        return marketCap;
    }

    @JsonProperty("market_cap")
    public void setMarketCap(Integer marketCap) {
        this.marketCap = marketCap;
    }

    @JsonProperty("profit")
    public Profit getProfit() {
        return profit;
    }

    @JsonProperty("1_month_profit")
    public void setOneMonthProfit(Double oneMonthProfit) {
        this.profit.oneMonthProfit = oneMonthProfit;
    }

    @JsonProperty("3_month_profit")
    public void setThreeMonthProfit(Double threeMonthProfit) {
        this.profit.threeMonthProfit = threeMonthProfit;
    }

    @JsonProperty("6_month_profit")
    public void setSixMonthProfit(Double sixMonthProfit) {
        this.profit.sixMonthProfit = sixMonthProfit;
    }

    class Profit {
        private Double oneMonthProfit;

        private Double threeMonthProfit;

        private Double sixMonthProfit;

        @Override
        public String toString() {
            return "Profit [oneMonthProfit=" + oneMonthProfit + ", threeMonthProfit=" + threeMonthProfit
                    + ", sixMonthProfit=" + sixMonthProfit + "]";
        }
    }

    @Override
    public String toString() {
        return "Security [securityName=" + securityName + ", marketCap=" + marketCap + ", profit=" + profit + "]";
    }
}

然后您设置了值。这是我的 运行.

的输出
Security [securityName=Apple, marketCap=130000, profit=Profit [oneMonthProfit=1.2, threeMonthProfit=-2.0, sixMonthProfit=3.0]]