Получить значения из строки и скопировать значения в свойства pojo: java
У меня есть строка, содержащая эти значения:
String verifyPaymentDetails = "{
2298597={mihpayid=403993715508098532, request_id=NULL, bank_ref_num=NULL, amt=53.77, disc=0.00, mode=CC, PG_TYPE=AXIS, card_no=512345XXXXXX2346, name_on_card=emu, udf2=0, addedon=2013-06-03 17:34:42, status=failure, unmappedstatus=failed, Merchant_UTR=NULL, Settled_At=NULL},
6503939={mihpayid=Not Found, status=Not Found}
}"
и я хочу извлечь значения из приведенной выше строки и сохранить их следующим образом:
ключ будет 2298597
и значения для ключа mihpayid=403993715508098532, request_id=NULL, bank_ref_num=NULL, amt=53.77, disc=0.00, mode=CC, PG_TYPE=AXIS, card_no=512345XXXXXX2346, name_on_card=emu, udf2=0, addedon=2013-06-03 17:34:42, status=failure, unmappedstatus=failed, Merchant_UTR=NULL, Settled_At=NULL
Map<String,Item> tag = new HashMap<String,VerifyPaymentRO>();
и это то, что мой VerifyPaymentRO
public class VerifyPaymentRO {
private String mihpayid;
private String request_id;
private String bank_ref_num;
private String amt;
private String disc;
private String mode;
private String PG_TYPE;
private String card_no;
private String name_on_card;
private String udf2;
private String addedon;
private String status;
private String unmappedstatus;
private String Merchant_UTR;
private String Settled_At;
public String getMihpayid() {
return mihpayid;
}
public void setMihpayid(String mihpayid) {
this.mihpayid = mihpayid;
}
public String getRequest_id() {
return request_id;
}
public void setRequest_id(String request_id) {
this.request_id = request_id;
}
public String getBank_ref_num() {
return bank_ref_num;
}
public void setBank_ref_num(String bank_ref_num) {
this.bank_ref_num = bank_ref_num;
}
public String getAmt() {
return amt;
}
public void setAmt(String amt) {
this.amt = amt;
}
public String getDisc() {
return disc;
}
public void setDisc(String disc) {
this.disc = disc;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getPG_TYPE() {
return PG_TYPE;
}
public void setPG_TYPE(String pG_TYPE) {
PG_TYPE = pG_TYPE;
}
public String getCard_no() {
return card_no;
}
public void setCard_no(String card_no) {
this.card_no = card_no;
}
public String getName_on_card() {
return name_on_card;
}
public void setName_on_card(String name_on_card) {
this.name_on_card = name_on_card;
}
public String getUdf2() {
return udf2;
}
public void setUdf2(String udf2) {
this.udf2 = udf2;
}
public String getAddedon() {
return addedon;
}
public void setAddedon(String addedon) {
this.addedon = addedon;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getUnmappedstatus() {
return unmappedstatus;
}
public void setUnmappedstatus(String unmappedstatus) {
this.unmappedstatus = unmappedstatus;
}
public String getMerchant_UTR() {
return Merchant_UTR;
}
public void setMerchant_UTR(String merchant_UTR) {
Merchant_UTR = merchant_UTR;
}
public String getSettled_At() {
return Settled_At;
}
public void setSettled_At(String settled_At) {
Settled_At = settled_At;
}
}
Так как же получить идентификатор из строки и значения для идентификатора и скопировать значения в POJO и сохранить их как идентификатор и объект в HashMap?
если есть способ для этого весной тоже хорошо
1 ответ
Предполагая, что это не JSON, и вам действительно нужно выполнить тяжелую работу, я думаю, что лучшим решением будет использование комбинации Rojo и BeanMap из commons-beanutils. Я также являюсь автором Rojo, поэтому я хотел бы показать, как его можно использовать в этом контексте. Я бы не рекомендовал прямое сопоставление регулярных выражений по группам из-за динамически изменяющегося числа пар внутри, поэтому я считаю, что BeanMap может сделать для нас много работы.
Сначала давайте обновим ваш компонент с помощью id, который будет служить первичным ключом:
public class VerifyPaymentRO {
private String id;
private String mihpayid;
private String request_id;
private String bank_ref_num;
private String amt;
private String disc;
private String mode;
private String PG_TYPE;
private String card_no;
private String name_on_card;
private String udf2;
private String addedon;
private String status;
private String unmappedstatus;
private String Merchant_UTR;
private String Settled_At;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMihpayid() {
return mihpayid;
}
public void setMihpayid(String mihpayid) {
this.mihpayid = mihpayid;
}
public String getRequest_id() {
return request_id;
}
public void setRequest_id(String request_id) {
this.request_id = request_id;
}
public String getBank_ref_num() {
return bank_ref_num;
}
public void setBank_ref_num(String bank_ref_num) {
this.bank_ref_num = bank_ref_num;
}
public String getAmt() {
return amt;
}
public void setAmt(String amt) {
this.amt = amt;
}
public String getDisc() {
return disc;
}
public void setDisc(String disc) {
this.disc = disc;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getPG_TYPE() {
return PG_TYPE;
}
public void setPG_TYPE(String PG_TYPE) {
this.PG_TYPE = PG_TYPE;
}
public String getCard_no() {
return card_no;
}
public void setCard_no(String card_no) {
this.card_no = card_no;
}
public String getName_on_card() {
return name_on_card;
}
public void setName_on_card(String name_on_card) {
this.name_on_card = name_on_card;
}
public String getUdf2() {
return udf2;
}
public void setUdf2(String udf2) {
this.udf2 = udf2;
}
public String getAddedon() {
return addedon;
}
public void setAddedon(String addedon) {
this.addedon = addedon;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getUnmappedstatus() {
return unmappedstatus;
}
public void setUnmappedstatus(String unmappedstatus) {
this.unmappedstatus = unmappedstatus;
}
public String getMerchant_UTR() {
return Merchant_UTR;
}
public void setMerchant_UTR(String merchant_UTR) {
Merchant_UTR = merchant_UTR;
}
public String getSettled_At() {
return Settled_At;
}
public void setSettled_At(String settled_At) {
Settled_At = settled_At;
}
}
Теперь рабочий пример может быть следующим:
public class VerifyPaymentExample {
public static void main(String[] args) {
String verifyPaymentDetails = "{" +
"2298597={mihpayid=403993715508098532, request_id=NULL, bank_ref_num=NULL, amt=53.77, disc=0.00, mode=CC, PG_TYPE=AXIS, card_no=512345XXXXXX2346, name_on_card=emu, udf2=0, addedon=2013-06-03 17:34:42, status=failure, unmappedstatus=failed, Merchant_UTR=NULL, Settled_At=NULL}," +
"6503939={mihpayid=Not Found, status=Not Found}" +
"}";
Map<String, VerifyPaymentRO> result = Rojo.asMap("(\\d+)=\\{(.+?)\\}", verifyPaymentDetails)
.entrySet()
.stream()
.map(e -> toBean(e))
.collect(Collectors.toMap(VerifyPaymentRO::getId, Function.identity()));
}
public static VerifyPaymentRO toBean(Map.Entry<String,String> entry) {
VerifyPaymentRO bean = new VerifyPaymentRO();
bean.setId(entry.getKey());
BeanMap beanMap = new BeanMap(bean);
Rojo.asMap("(\\w.+?)=([^,]+)", entry.getValue())
.forEach( (key, value) -> {
//Some additional mapping is required due to non-standard naming
if ("Settled_At".equals(key)) {
beanMap.put("settled_At", value);
} else if ("Merchant_UTR".equals(key)) {
beanMap.put("merchant_UTR", value);
} else {
beanMap.put(key, value);
}
});
return bean;
}
}
Если вы запустите код и посмотрите на результат, у вас должно быть именно то, что вы хотите.