Генерация удобочитаемых сообщений 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 представление и использование информации, необходимой для вашей продукции.

Другие вопросы по тегам