gpt4 book ai didi

java - 通过Jackson注解将带有大量属性的json反序列化为java类

转载 作者:行者123 更新时间:2023-11-30 06:36:51 25 4
gpt4 key购买 nike

所以我目前正在使用 Jackson 将 JSON 反序列化为 java 对象。一切正常,但我也有一些字段,例如:

对于这种 JSON 文件:

{
"uid": 7,
"asset": 123,
"currency1_balance": 0,
"currency2_balance": 0,

... ...

"currencyN_balance": 0,
}

我们可以通过下面的java类反序列化它:

@Test
public void testBalanceJSON() throws IOException {
// Read in the JSON from the example resources
InputStream is = BalanceTest.class.getResourceAsStream("/example-balance-data.json");
//Use Jackson to parse it
ObjectMapper mapper = new ObjectMapper();
Balance balance = mapper.readValue(is, Balance.class);
}

... ...

@JsonIgnoreProperties(ignoreUnknown = true)
public class Balance {
private final BigDecimal uid;
private final BigDecimal asset;
private final BigDecimal currency1Balance;
private final BigDecimal currency2Balance;
// ... ...
private final BigDecimal currencyNBalance;

@JsonCreator
public Balance(@JsonProperty("uid") BigDecimal uid, @JsonProperty("asset") BigDecimal asset,
@JsonProperty("currency1_balance") BigDecimal currency1Balance,
@JsonProperty("currency2_balance") BigDecimal currency2Balance,
// ... ...
@JsonProperty("currencyN_balance") BigDecimal currencyNBalance) {
this.uid = uid;
this.asset = asset;
this.currency1Balance = currency1Balance;
this.currency2Balance = currency2Balance;
// ... ...
this.currencyNBalance = currencyNBalance;
}
}

在上面的情况下,我必须编写大量代码来处理“currencyN_balance”和“currencyNBalance”之间的映射。一旦添加/删除了货币,我就必须相应地修改代码,这是相当不灵活的。然后我找到了以下方法来自定义反序列化过程。

  @JsonCreator
public static Balance Create(Map<String, Object> jsonMap) {
//Resovle the map
BigDecimal uid = new BigDecimal(jsonMap.get("uid").toString());
BigDecimal asset = new BigDecimal(jsonMap.get("asset").toString());
for (Map.Entry<String, Object> entry : jsonMap.entrySet()){
if (entry.getKey().startsWith("currency")) {
//Do something...
}
}
//Then construct the Balance instance and return
}

通过使用上面的方法,我可以摆脱枯燥且容易出错的映射。但我无法利用注释来处理某些参数的反序列化(例如 uid、asset)。

有什么方法可以结合上述两种技术的优点吗?(使用带有uid、asset等参数的注解,同时能够自定义货币映射)

谢谢。

最佳答案

这是一个令人厌恶的 JSON。该currency_[1..n]_balance应该在一个数组中......因为它是一个数组,但以蹩脚的方式编码。

无论如何,这不是你的错(我希望如此)。为此,您可以使用 Jackson @JsonAnyGetter 和 @JsonAnySetter 注释(如果您想序列化和反序列化此类,否则您只能使用其中之一)。

例如

@JsonAnySetter
public void set(String name, String value) {
//do funky transformation/assigment
}

Jackson 将使用它无法映射的任何属性调用该方法。因此,您可能需要添加一些逻辑来忽略您不感兴趣的属性。

关于java - 通过Jackson注解将带有大量属性的json反序列化为java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com