Генерация удобочитаемых сообщений SWIFT с использованием Prowide-Core?
Я использую Prowide-Core для обработки сообщений SWIFT. В настоящее время я использую методы JSON для создания удобочитаемых версий моих сообщений, если мне нужно их выгружать. Это производит вывод как это:
...
}, {
"97A" : ":SAFE//0123-0123456-55-000"
}, {
...
Т.е. я получаю буквенно-цифровые коды, например 97A
, для имен полей.
Однако это я смотрю на Field97A.java:471
Я вижу, что он (и все остальные поля) знают свои более читаемые имена (Qualifier
а также Account
в случае 97A
).
Я пытался найти некоторые toString()
Подобный метод, который использует эту информацию для создания чего-то более читабельного, чем вывод JSON, но еще ничего не нашел.
Есть ли такой метод на SwiftMessage
или один из родственных классов? Или кто-то написал что-то хорошее, что может пройти сообщение и распечатать его, используя информацию, возвращенную getComponentLabels()
так далее?
2 ответа
Я один из авторов. Для дальнейшего использования в предстоящем выпуске SRU2018 (запланированном на октябрь) мы обновили весь JSON API на всех уровнях абстракции модели.
ToJson в SwiftMessage объект все еще производит кортежи простого имени / значения для тегов. Однако в классах MTnnn toJson использует Field для создания JSON с такими бизнес-метками, как:
{ "name": "90A",
"qualifier": "DEAL",
"percentageTypeCode": "PRCT",
"price": "102,713552"
},
{ "name": "36B",
"qualifier": "ESTT",
"quantityTypeCode": "AMOR",
"quantity": "7999999,573"
},
{ "name": "97A",
"qualifier": "SAFE",
"account": "0123-0123456-55formatted
}
Помимо JSON, вы можете перебирать поля и печатать форматированные имена и значения с помощью доступных методов getLabel и getValueDisplay.
Например:
Locale locale = Locale.getDefault();
SwiftMessage sm = SwiftMessage.parse("{1:F01BACOARB1A0B20000000000}{2:I103ADRBNL21XXXXU2}{3:{108:FOOB3926BE868XXX}}{4:\n" +
":20:REFERENCE\n" +
":23B:CRED\n" +
":32A:180730USD1234567,89\n" +
":50A:/12345678901234567890\n" +
"CFIMHKH1XXX\n" +
":59:/12345678901234567890\n" +
"JOE DOE\n" +
"MyStreet 1234\n" +
":71A:OUR\n" +
"-}");
System.out.println("Sender: " + sm.getSender());
System.out.println("Receiver: " + sm.getReceiver() + "\n");
for (Tag tag : sm.getBlock4().getTags()) {
Field field = tag.asField();
System.out.println(Field.getLabel(field.getName(), "103", null, locale));
System.out.println(field.getValueDisplay(locale) + "\n");
}
Будет производить этот вывод:
Отправитель: BACOARB1A0B2 Получатель: ADRBNL21XXXX
Sender's Reference
REFERENCE
Bank Operation Code
CRED
Value Date/Currency/Interbank Settled Amount
Jul 30, 2018 USD 1,234,567.89
Ordering Customer
12345678901234567890 CFIMHKH1XXX
Beneficiary Customer
12345678901234567890 JOE DOE MyStreet 1234
Details of Charges
OUR
Где компоненты разделены и отформатированы для локали. И если вам также нужны метки для каждого компонента, вы можете выполнить дальнейшую итерацию следующих компонентов:
for (Tag tag : sm.getBlock4().getTags()) {
Field field = tag.asField();
System.out.println("\n" + Field.getLabel(field.getName(), "103", null, locale));
for (int component = 1 ; component <= field.componentsSize() ; component++) {
if (field.getComponent(component) != null) {
System.out.print(field.getComponentLabel(component) + ": ");
System.out.println(field.getValueDisplay(component, locale));
}
}
}
Производя этот другой вывод:
Sender's Reference
Reference: REFERENCE
Bank Operation Code
Type: CRED
Value Date/Currency/Interbank Settled Amount
Date: Jul 30, 2018
Currency: USD
Amount: 1,234,567.89
Ordering Customer
Account: 12345678901234567890
BIC: CFIMHKH1XXX
Beneficiary Customer
Account: 12345678901234567890
Name And Address: JOE DOE
Name And Address 2: MyStreet 1234
Details of Charges
Code: OUR
Наконец, если вам интересно, библиотека Integrator от Prowide включает готовых посетителей с распечатками для создания HTML, TXT и XML, включая структурированные последовательности и BIC, дополненные информацией об учреждении. Вы можете попросить Prowide пройти испытание.
SwiftTagListBlock обеспечивает toJson
метод, который перебирает Tag
объекты:
public String toJson() {
final StringBuilder sb = new StringBuilder();
sb.append("[ \n");
if (this.tags != null && !this.tags.isEmpty()) {
for (int i=0;i<this.tags.size();i++) {
final Tag t = this.tags.get(i);
sb.append("{ \"").append(t.getName()).append("\" : \"").append(escapeJson(t.getValue())).append("\" }");
if (i+1<this.tags.size()) {
sb.append(',');
}
sb.append('\n');
}
}
sb.append("]");
return sb.toString();
}
Вы можете настроить исходный код и вызвать asField()
метод Tag, чтобы иметь доступ к Field
представление и использование информации, необходимой для вашей продукции.