4

我正在使用WIFEJava 库将消息解析SWIFTJSON格式。

对于“从 Swift 输出”的消息,它在headerfor{1:..}{4..}作为确认的一部分中包含重复的块。解析消息时,没有抛出输出/错误。如何处理?

另外,如果我使用相应MT类的库函数来表示字段 50k forMT103并调用函数 say getcomponent1()or ,它是否会通过重复和块getName&Address1()返回此消息的正确值?14

MT103粘贴在下面的示例:

{1:F21XXXXXXBBAXXX9735415014}{4:{177:1410291057}{451:0}}{1:F01XXXXXNBBAXXX9735415014}{2:O1031057141029XXXXXNBBAXXX16235602381410291057U}{4:

:20:2039TT20W4407225

:23B:信用

:32A:141029AUD844,00

:33B:AUD844,00

:50K:/XXXXXXXXXXXX XXXXXXXXX

ABC 律师事务所有限公司

摩尔街 19 号

车工

:52A:XXXXINBBXXX

:53A:NATAAU33

:57A:XXXXXNBBXXX

:59:/200006547541

ABC 技术解决方案 PVT LT

2 级 1 区 TRANSASIA CORPORATE

公园卡卡纳德

:70:只有受益银行被授权

转换货币

:71A:我们的

:72:/REC/DAG29102014117

//不完整的指令目的公司

//DE ​​CHARGES 扣除 20 澳元

-}{5:{MAC:00000000}{CHK:8A860CBAFFFD}}{S:{SAC:}{COP:S}}

4

2 回答 2

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.

既然您知道如何正确解析所有内容,您就不必担心剩下的问题了。

于 2015-05-22T10:32:12.947 回答
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());
        }
于 2016-12-27T16:52:38.153 回答