2017-09-01 10 views
0

jacksonマッパーを使用してJSONデータをJavaクラスにマップしようとしています。私のJSONデータは入れ子のない1つのフラットオブジェクトですが、のデータの一部を内部クラスにマップしたいと思います。jacksonマッパーを使用してJSONデータの一部をネストされたクラスにマップします。

以下のJSONデータを参照すると、security_namemarket_capフィールドはSecurity classに直接マップされます。 しかし1_month_profit3_month_profit6_month_profitフィールドは内部クラスにマッピングする必要があります - Profit class(例えば1_month_profit利益クラスのprivate Double oneMonthProfit

現在、私はJSONデータをデシリアライズするとき、私はのためのすべての正しいマッピングを持っています。親クラス(セキュリティ)の変数が、子クラス(利益)の変数はが割り当てられていない

デシリアライズされたデータのスナップショット:。

{ 
    "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 
     ... 
} 

Securityクラスは全体の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; 
    } 
    } 
} 

私は内部クラスで@JsonProperty注釈を追加することであろうと期待していました残念ながら、これは何の効果もありませんでした。

私はジャクソンマッパーを使ってこれを行う方法が必要なように感じますが、これを達成する方法を見つけることができませんでした..あなたの助けが大いに評価されるでしょう!少し早いですがお礼を。

+0

問題を詳しく説明できますか。この構造体が正しく見える –

+0

現在の構造体で逆シリアル化されたデータの結果(上記)を見ると、 "profit"フィールドのネストされたフィールドにはnull値があります。利益の中のすべてのフィールドの値をマップできるようにしたいと思います。 –

+0

次の回答を参照し、データを適切にマップします –

答えて

0

Securityクラス自体に対応するセッターを作成し、ネストされたProfitオブジェクトにマッピングすることができます。

ここには、SecurityProfitの変更されたクラスがあります。

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]] 
関連する問題