我使用Prowide-Core进行SWIFT邮件处理。目前,如果我需要将它们转储出来,我会使用JSON方法生成人类可读的消息版本。这会产生如下输出:
...
}, {
"97A" : ":SAFE//0123-0123456-55-000"
}, {
...
即。我为字段名称获取了字母数字代码,例如97A
。
然而,我看Field97A.java:471
我可以看到它(和所有其他字段)知道更易读的人名(Qualifier
和Account
97A
})。
我尝试过寻找一些toString()
类似的方法,利用这些信息来制作比JSON输出更具可读性的东西,但还没有找到任何东西。
SwiftMessage
或其中一个相关类是否有这样的方法?或者有人写了一些很好的东西,可以使用getComponentLabels()
等返回的信息遍历邮件并打印出来?
答案 0 :(得分:2)
我是作者之一。为了将来参考,在即将发布的SRU2018版本(计划于10月发布)中,我们对所有模型抽象层中的所有JSON API进行了改进。
SwiftMessage对象中的toJson仍会为标签生成纯名称/值元组。但是,在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进行试用。
答案 1 :(得分:0)
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
表示并使用输出所需的信息。