gpt4 book ai didi

java - 将 List 解析为 JSON

转载 作者:行者123 更新时间:2023-12-01 14:27:12 25 4
gpt4 key购买 nike

我正在阅读 Real-World Software Development 这本书,当前章节是关于编写一个 BankStatementCSVParser 来读取这样的文件:

30-01-2017,-100, Deliveroo
30-01-2017,-50, Tesco
01-02-2017,6000, Salary
02-02-2017,2000, Royalties
02-02-2017,-4000, Rent
03-02-2017,3000, Tesco
05-02-2017,-30, Cinema

并解析每一行并输出一个此类的对象:

public class BankTransaction {
private final LocalDate date;
private final double amount;
private final String description;

public BankTransaction(final LocalDate date, final double amount,
final String description) {
this.date = date;
this.amount = amount;
this.description = description;
}

public LocalDate getDate() {
return date;
}

public double getAmount() {
return amount;
}

public String getDescription() {
return description;
}
}

这工作正常而且 CSV 很容易(特别是因为我正在复制这本书...),问题出现在本章末尾,当我被要求自己实现 BankStatementJSONParser 如果我可以。

我已经尝试过 GSON 和 Jackson,但我真的无法得到任何示例,因为我的 BankTransaction 类是不可变的并且不允许 setter 。

我设法让一个解决方案起作用,但看起来很糟糕:

public List<BankTransaction> parseLinesFrom(List<String> lines) {
Map<String, ?> map = new Gson().fromJson(String.join(" ", lines), Map.class);
List<?> listOfTransactions = (List<?>) map.get("transactions");

List<BankTransaction> bankTransactions = new ArrayList<>();
listOfTransactions.forEach(rawJson -> {
LinkedTreeMap<String, ?> javaJson = (LinkedTreeMap<String, ?>) rawJson;

final LocalDate localDate = LocalDate.parse(javaJson.get("date").toString(), DATE_PATTERN);
final double amount = Double.parseDouble(javaJson.get("amount").toString());
final String description = javaJson.get("description").toString();
BankTransaction newTransaction = new BankTransaction(localDate, amount, description);
bankTransactions.add(newTransaction);
});
return bankTransactions;
}

感谢任何关于如何让这个不那么难看的见解,也许问题出在我自己编写的 .json 文件上:

{
"transactions": [
{
"date": "30-01-2017",
"amount": -100,
"description": "Deliveroo"
},
{
"date": "01-02-2017",
"amount": 6000,
"description": "Salary"
}
]
}

最佳答案

您的问题有一些不同的解决方案:

  1. 您可以创建自己的 TypeAdapter解析列表
  2. 你可以使用 TypeToken s 在运行时告诉 Gson 你将加载什么(这肯定会破坏 date 字段)
  3. 您可以创建自己的 JsonDeserializer

我个人会做第二个并创建自定义 TypeAdapter仅用于 LocalDate,它在注册后由 Gson 自动应用。

关于java - 将 List<String> 解析为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62057501/

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