Я слежу за книгой «Разработка программного обеспечения в реальном мире», и текущая глава была посвящена написанию 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
класс неизменен и не допускает сеттеров.
Мне удалось заставить одно решение работать, но на него ужасно смотреть:
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"
}
]
}