我正在使用WIFE
Java库将SWIFT
条消息解析为JSON
格式。
对于"来自Swift"的输出,它包含header
中{1:..}
和{4..}
的重复块作为确认的一部分。解析消息时,不会抛出输出/错误。怎么办呢?
另外,如果我使用相应MT
类的库函数作为MT103
的字段50k并调用函数说getcomponent1()
或getName&Address1()
,它是否会返回重复1
和4
阻止此消息的正确值?
下面粘贴的示例MT103
:
{1:F21XXXXXXBBAXXX9735415014} {4:{177:1410291057} {451:0}} {1:F01XXXXXNBBAXXX9735415014} {2:O1031057141029XXXXXNBBAXXX16235602381410291057U} {4:
:20:2039TT20W4407225
:23B:CRED
:32A:141029AUD844,00
:33B:AUD844,00
:50K:/ XXXXXXXXXXXX XXXXXXXX
ABC LAW FIRM PTY LTD
19 MOORE STREET
TURNER
:52A:XXXXINBBXXX
:53A:NATAAU33
:57A:XXXXXNBBXXX
:59:/ 200006547541
ABC技术解决方案PVT LT
LEVEL 2 BLOCK 1 TRANSASIA CORPORATE
PARK KAKKANAD
:70:只有受益银行授权
转换货币
:71A:OUR
:72:/ REC / DAG29102014117
//不完整的指示目的CO
// DE收费20澳元DEDUCTED
- } {5:{MAC:00000000} {CHK:8A860CBABFFD}} {S:{SAC:} {COP:S}}
答案 0 :(得分:3)
您所看到的行为是设计性的。
WIFE库将尝试尽可能多地解析您的输入,直到它检测到其余输入不再是单个有效SWIFT消息的一部分。
在你的情况下,
{1:F21XXXXXXBBAXXX9735415014} {4:{177:1410291057} {451:0}}
是一个有效的SWIFT消息。之后的所有内容都是另一个有效的SWIFT消息,但是WIFE解析器不会打扰它,因为它检测到块4之后没有SWIFT块5(根据SWIFT标准),所以它只是将邮件的其余部分视为未解析的文本。
假设input
是你的整个输入字符串,你应该有类似的代码:
IConversionService ics = new ConversionService();
SwiftMessage sm = ics.getMessageFromFIN(input);
之后,您可以查看
Integer unparsedSize = sm.getUnparsedTextsSize();
你有一条未解析的消息,你可以随心所欲地做任何事情。在您的情况下,您可以像这样检索未解析的部分:
String unparsedInput = sm.getUnparsedTexts().getText(0);
SwiftMessage sm2 = ics.getMessageFromFIN(unparsedInput);
现在,sm2
是您正在使用的真实的 SWIFT消息,以
{1:F01XXXXXNBBAXXX9735415014} {2:O103 ...
使用它执行您想要的操作,并将其视为与sm
中的消息分开的单独消息。
既然您知道如何正确解析所有内容,那么您不必担心其余的问题。
答案 1 :(得分:0)
同样的另一个例子:
final String fin = "{1:F21FOOLHKH0AXXX0304009999}{4:{177:1608140809}{451:0}}{1:F01FOOLHKH0AXXX0304009999}{2:O9401609160814FOOLHKH0AXXX03040027341608141609N}{4:\n"+
":20:USD940NO1\n"+
(...)
"-}{5:{CHK:0FEC1E4AEC53}{TNG:}}{S:{COP:S}}";
final SwiftParser parser = new SwiftParser();
SwiftMessage sm = parser.parse(fin);
if (StringUtils.equals(sm.getBlock1().getServiceId(), "21") && sm.getUnparsedTextsSize() > 0) {
sm = sm.getUnparsedTexts().getTextAsMessage(0);
}
System.out.println("Message Type: "+ sm.getType());
if (sm.isType(940)) {
/*
* Specialize the message to its specific model representation
*/
MT940 mt = new MT940(sm);
/*
* Print details of a specific field
*/
System.out.println("Reference: "+mt.getField20().getValue());
}