You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:36:03