使用 jackson 映射器有选择地将 JSON 数据的一部分映射到嵌套的 class
Selectively map a part of JSON data to nested class using jackson mapper
我正在尝试使用 jackson 映射器将 JSON 数据映射到 Java Class。虽然我的 JSON 数据是一个平面对象,没有嵌套,但我想 将部分数据映射到其内部 Class。
为了说明我的观点,如果您查看下面的 JSON 数据,security_name
和 market_cap
字段直接映射到 Security class
。
但是 1_month_profit
、3_month_profit
、6_month_profit
字段需要映射到内部 class - Profit class
(例如 1_month_profit
到 private 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
对象。
这是 Security
和 Profit
的修改后的 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]]
我正在尝试使用 jackson 映射器将 JSON 数据映射到 Java Class。虽然我的 JSON 数据是一个平面对象,没有嵌套,但我想 将部分数据映射到其内部 Class。
为了说明我的观点,如果您查看下面的 JSON 数据,security_name
和 market_cap
字段直接映射到 Security class
。
但是 1_month_profit
、3_month_profit
、6_month_profit
字段需要映射到内部 class - Profit class
(例如 1_month_profit
到 private 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
对象。
这是 Security
和 Profit
的修改后的 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]]