微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用自定义反序列化器进行解析时,不会添加从XML响应解析的值之一

如何解决使用自定义反序列化器进行解析时,不会添加从XML响应解析的值之一

我已经编写了一个使用Java的自定义反序列化程序(我正在尝试改进),以便解析给定的XML响应,而不必诉诸于构建POJO。虽然我的解串器能够令人满意地解析主节点类型的重复元素,但是在尝试处理重复的内部节点时,它会丢失其中一个值。

这是我要解析的响应的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <control>
        <status>success</status>
        <senderid>fivetranMPP</senderid>
        <controlid>1597342164</controlid>
        <uniqueid>false</uniqueid>
        <dtdversion>3.0</dtdversion>
    </control>
    <operation>
        <authentication>
            <status>success</status>
            <userid>fivetranMPP</userid>
            <companyid>AWN</companyid>
            <locationid></locationid>
            <sessiontimestamp>2020-08-13T18:10:47+00:00</sessiontimestamp>
            <sessiontimeout>2020-08-14T00:10:47+00:00</sessiontimeout>
        </authentication>
        <result>
            <status>success</status>
            <function>readByQuery</function>
            <controlid>0fa82ddf-5280-4728-ab7e-a29c34b04018</controlid>
            <data listtype="vendorvisibility" count="1000" totalcount="1246" numremaining="246" resultId="7765623632XzWCJxbed5SzeEGoIWSTMwAAABE4">
                <vendorvisibility>
                    <vendORID>*****</vendORID>
                    <NAME>*****</NAME>
                    <VISIBILITY>Restricted</VISIBILITY>
                    <RESTRICTEDLOCATIONS>
                        <LOCATIONID>900</LOCATIONID>
                        <LOCATIONID>910</LOCATIONID>
                        <LOCATIONID>920</LOCATIONID>
                        <LOCATIONID>930</LOCATIONID>
                    </RESTRICTEDLOCATIONS>
                    <RESTRICTEDDEPARTMENTS></RESTRICTEDDEPARTMENTS>
                </vendorvisibility>
                <vendorvisibility>
                    <vendORID>*****</vendORID>
                    <NAME>*****</NAME>
                    <VISIBILITY>Restricted</VISIBILITY>
                    <RESTRICTEDLOCATIONS>
                        <LOCATIONID>940</LOCATIONID>
                        <LOCATIONID>950</LOCATIONID>
                        <LOCATIONID>960</LOCATIONID>
                        <LOCATIONID>970</LOCATIONID>
                    </RESTRICTEDLOCATIONS>
                    <RESTRICTEDDEPARTMENTS></RESTRICTEDDEPARTMENTS>
                </vendorvisibility>
                <vendorvisibility>
                    <vendORID>*****</vendORID>
                    <NAME>*****</NAME>
                    <VISIBILITY>Unrestricted</VISIBILITY>
                    <RESTRICTEDLOCATIONS></RESTRICTEDLOCATIONS>
                    <RESTRICTEDDEPARTMENTS></RESTRICTEDDEPARTMENTS>
                </vendorvisibility>
                ........

我正在尝试解析<LOCATIONID>中存在的<RESTRICTEDLOCATIONS>个节点。但是我缺少第二个<vendorvisibility>节点中的一个节点,即<LOCATIONID>940</LOCATIONID>,它是第二个主节点中这种类型的第一个节点。

这是我正在使用的反序列化代码:-

public class DuplicatetoArrayJsonNodeDeserializer extends JsonNodeDeserializer {
    ArrayNode objectDataArray;
    ArrayNode nestedobjectDataArray;
    String subNodeFieldName;
    HashSet<String> tablesSet;

    DuplicatetoArrayJsonNodeDeserializer() {
        super();
        tablesSet = SageIntacctEndpoint.getTables();
    }

    @Override
    protected void _handleDuplicateField(
            JsonParser jsonParser,DeserializationContext deserializationContext,JsonNodeFactory jsonNodeFactory,String fieldName,ObjectNode objectNode,JsonNode oldValue,JsonNode newValue) {
        if (tablesSet.contains(fieldName.toLowerCase())) {
            if (objectDataArray == null) {
                objectDataArray = jsonNodeFactory.arrayNode();
                objectDataArray.add(oldValue);
                objectDataArray.add(newValue);
            } else {
                objectDataArray.add(newValue);
            }
            nestedobjectDataArray = null;
            objectNode.set("objectData",objectDataArray);
        } else {
            subNodeFieldName = fieldName;
            if(nestedobjectDataArray == null) {
                nestedobjectDataArray = jsonNodeFactory.arrayNode();
                nestedobjectDataArray.add(oldValue);
                nestedobjectDataArray.add(newValue);
            } else {
                nestedobjectDataArray.add(newValue);
            }
        }
    }
}

我使用nestedobjectDataArray尝试将所有<LOCATIONID>类型的值存储在ArrayNode对象中。但是,如前所述,我错过了nestedobjectDataArray中的值之一,该值是响应中第二个<LOCATIONID>主节点中存在的第一个<vendorvisibility>型节点。

Screenshot of the code working.

如上面的屏幕快照所示,应该将oldValue的{​​{1}}作为最后一个元素添加""940""中。而是仅将节点nestedobjectDataArray添加到列表中。预期的行为是""950""是列表中的最后一个值,并且在向前移动调试指针时,""940""添加到列表中。

据我所知,这可能与以下事实有关:数组中的前四个值属于第一个主节点,即""950"",而其他值分别是<vendorvisibility>和{ {1}}属于第二个主节点。

导致意外行为的逻辑流程是什么?理解这一点的任何帮助都将不胜感激

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。