2017-09-01 6 views
0

J'essaie de mapper des données JSON dans une classe Java en utilisant le mappeur jackson. Alors que mes données JSON sont un objet plat, sans imbrication, je voudrais mapper une partie des données à sa classe interne. Pour illustrer mon point, si vous regardez les données JSON ci-dessous, security_name et market_cap champs sont mappés directement au Security class. Mais le 1_month_profit, 3_month_profit, 6_month_profit champs doivent mapper à une classe interne -.. Profit class (par exemple 1_month_profit-private Double oneMonthProfit de la classe ProfitMapper sélectivement une partie des données JSON à une classe imbriquée à l'aide du mappeur jackson

Actuellement, quand je désérialiser les données JSON, j'ai toutes les correspondances correctes pour la classe parent (sécurité) des variables, mais le

les variables ne sont pas classe enfant (Profit) attribué un instantané des données désérialisé.

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

Mes données JSON se présente comme suit:

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

La classe de sécurité cartes de l'ensemble des données JSON comme suit:

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; 
    } 
    } 
} 

J'espérais que l'ajout d'@JsonProperty annotation dans la classe interne serait résoudre le problème, mais malheureusement, cela n'a eu aucun effet.

Je me sens comme il doit y avoir un moyen de le faire en utilisant jackson mappeur, mais je n'ai pas été en mesure de trouver un moyen d'y parvenir pour le moment .. Votre aide sera très appréciée! Merci d'avance.

+0

pouvez-vous élaborer votre problème. Cette structure semble correcte –

+0

Si vous regardez le résultat des données désérialisées (ci-dessus) avec la structure actuelle, les champs imbriqués dans le champ "profit" ont une valeur nulle. Je voudrais être en mesure de cartographier les valeurs de tous les champs dans le but lucratif. –

+0

se référer à la réponse suivante, il va cartographier les données correctement –

Répondre

0

Vous pouvez créer les paramètres de mise en forme correspondants sur la classe Security elle-même qui la mappe sur l'objet Profit imbriqué. Voici les classes modifiées pour Security et Profit.

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 + "]"; 
    } 
} 

Et puis vous avez les valeurs définies. Voici la sortie pour ma course.

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