如何解决使用自定义反序列化器进行解析时,不会添加从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>
型节点。
如上面的屏幕快照所示,应该将oldValue
的{{1}}作为最后一个元素添加到""940""
中。而是仅将节点nestedobjectDataArray
添加到列表中。预期的行为是""950""
是列表中的最后一个值,并且在向前移动调试指针时,""940""
被添加到列表中。
据我所知,这可能与以下事实有关:数组中的前四个值属于第一个主节点,即""950""
,而其他值分别是<vendorvisibility>
和{ {1}}属于第二个主节点。
导致意外行为的逻辑流程是什么?理解这一点的任何帮助都将不胜感激
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。