使用 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
我可以看到它(以及所有其他字段)知道它们更易读的名称(Qualifier
和 Account
在 97A
).
我已经尝试寻找一些类似 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();
}
您可以调整源代码并调用 Tag 的 asField()
方法,以便访问 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 扩展机构信息。可以找普维德试用一下。
我正在使用 Prowide-Core 进行 SWIFT 消息处理。目前,如果我需要转储消息,我会使用 JSON 方法来生成人类可读的消息版本。这会产生如下输出:
...
}, {
"97A" : ":SAFE//0123-0123456-55-000"
}, {
...
即我得到字段名称的字母数字代码,例如 97A
。
但是我看 Field97A.java:471
我可以看到它(以及所有其他字段)知道它们更易读的名称(Qualifier
和 Account
在 97A
).
我已经尝试寻找一些类似 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();
}
您可以调整源代码并调用 Tag 的 asField()
方法,以便访问 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 扩展机构信息。可以找普维德试用一下。