使用 Prowide-Core 生成人类可读的 SWIFT 消息?

Generating human readable SWIFT messages using Prowide-Core?

我正在使用 Prowide-Core 进行 SWIFT 消息处理。目前,如果我需要转储消息,我会使用 JSON 方法来生成人类可读的消息版本。这会产生如下输出:

...
}, {
  "97A" : ":SAFE//0123-0123456-55-000"
}, {
...

即我得到字段名称的字母数字代码,例如 97A

但是我看 Field97A.java:471 我可以看到它(以及所有其他字段)知道它们更易读的名称(QualifierAccount97A).

我已经尝试寻找一些类似 toString() 的方法,利用这些信息来生成比 JSON 输出更具可读性的东西,但还没有找到任何东西。

SwiftMessage 或相关 类 上有这样的方法吗?或者有人写了一些不错的东西,可以遍历消息并使用 getComponentLabels() 等返回的信息打印出来?

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();
      }

您可以调整源代码并调用 TagasField() 方法,以便访问 Field 表示并使用输出所需的信息。

我是作者之一。为了将来参考,在即将发布的 SRU2018 版本(计划于 10 月)中,我们改进了所有模型抽象层中的所有 JSON API。

SwiftMessage 对象中的 toJson 仍然为标签生成纯 name/value 元组。然而,在 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

最后,如果您有兴趣,Prowide 的 Integrator 库包括开箱即用的打印输出访问器,用于生成 HTML、TXT 和 XML,包括结构化序列和 BIC 扩展机构信息。可以找普维德试用一下。