[英]What is the elegant way to parse a map into an object?
我有一個隨機的 object,我需要解析 Map<String, String>
public class ExternalIncome {
private Long operationId;
private OffsetDateTime operationDate;
private String operationCode;
private String documentNumber;
private OffsetDateTime documentDate;
private String correspondentInn;
private String correspondentName;
private String correspondentAccount;
}
我只是這樣創建的,但我認為它不是很優雅,而且很丑陋。 此外,我需要攔截解析的每個迭代,以將動態字段保存到 object 內部的 Map<String, String> 中。
public static ExternalIncome create(Map<String, String> fields) {
ExternalIncome externalIncome = new ExternalIncome();
fields.forEach((k, v) -> {
switch (k) {
case "OPER_ID":
externalIncome.setOperationId(nullableLong(v));
break;
case "OPER_DATE":
externalIncome.setOperationDate(Utils.toOffsetDateTime(v));
break;
etc
你能幫我找到最好的方法嗎?
如果允許使用第三方庫,則可以使用 Jackson 的 ObjectMapper class 來完成。
final ObjectMapper mapper = new ObjectMapper();
final ExternalIncome income = mapper.convertValue(fields,ExternalIncome.class)
在你的案例中我沒有看到任何優雅的解決方案,但是你通過使用 map 擺脫了 switch/case,其中鍵是字段 map 中的字段名稱,值是 BiDirectionalConsumer。 可能不是最好的解決方案,但仍然如此。 注意:小心強制轉換和類型轉換。
假設您有字段 map:
Map<String, String> fields = new HashMap<>();
fields.put("OPER_ID", "3");
您可以使用要執行的字段名稱和操作來定義第二個 map:
HashMap<String, BiConsumer<ExternalIncome, Object>> fieldsOperations = new HashMap<>();
fieldsOperations.put("OPER_ID", (extIncome, valueToSet) ->
extIncome.setOperationId(Long.valueOf((String) valueToSet))); //add as many as you want
然后你在哪里迭代你的 map 字段:
ExternalIncome externalIncome = new ExternalIncome();
fields.forEach((k,v) -> {
BiConsumer<ExternalIncome, Object> operation = fieldsOperations.get(k);
if (operation == null) {
//add to dynamic fields map
return;
}
operation.accept(externalIncome, v);
});
或者您可以重新考慮您的數據結構以擺脫擁有動態字段的想法,但如果您的用例可能的話,請考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.