使用XQuery实现单/多条记录JSON输出统一为数组格式的方法
XQuery强制XML转JSON时单元素输出为数组的解决方案
可以实现该需求,你遇到的问题是默认XML转JSON的序列化规则导致的:当元素仅出现1次时会被序列化为对象,出现多次才会被序列化为数组,只要主动标记需要强制输出为数组的元素即可。
方案1:通过扩展属性标记数组元素(适配大多数XQuery处理器,如Saxon)
首先在XQuery开头声明JSON序列化扩展命名空间,然后给需要强制转数组的<records>和<User_records>元素加上数组标记属性,修改后的完整代码如下:
declare namespace json = "http://saxon.sf.net/json"; <Response> <totalSize>{totalSize/number()}</totalSize> <done>{done/text()}</done> <nextRecordsUrl>{nextRecordsUrl/text()}</nextRecordsUrl> { let $input:=/root/records for $i in $input return <records json:array="true"> <Product1>{$i/Product_Lookup_BI__c/text()}</Product1> <EventLastModifiedDate>{$i/LastModifiedDate/text()}</EventLastModifiedDate> <Venue>{$i/Venue_vod__r/(fn:concat(fn:concat(fn:concat(fn:concat(fn:concat(fn:concat(BI_Country_Code__c/text(),'-'),State_Province_vod__c/text()),'-'),City_vod__c/text()),'-'),Address_vod__c/text()))}</Venue> { let $a:=$i/EM_Event_Team_Member_vod__r/records for $y in $a return <User_records json:array="true"> <AttendeeLastModifiedDate>{$y/LastModifiedDate/text()}</AttendeeLastModifiedDate> <EmployeeName>{$y/Team_Member_vod__r/Name/text()}</EmployeeName> <EmployeeID>{$y/Team_Member_vod__r/BIDS_ID_BI__c/text()}</EmployeeID> </User_records> } </records> } </Response>
如果使用的是其他XQuery实现(如MarkLogic),扩展属性的命名空间可能略有差异,核心逻辑一致,参考对应处理器的JSON序列化文档即可。
方案2:通过序列化参数配置(无需修改XML结构)
如果你的XQuery处理器支持调整JSON序列化参数,可以直接在序列化阶段指定需要强制转为数组的元素名,不需要修改XML构造逻辑,以Saxon为例,在XQuery开头添加如下配置即可:
declare option output:method "json"; declare option output:array-names "records User_records";
修改完成后,无论records和User_records下有几条记录,输出的JSON都会保持数组格式,完全符合预期。
内容的提问来源于stack exchange,提问作者iswariya Kumaravelu
相关产品推荐
相关产品推荐

