BizTalk 2020:XML转JSON时确保filters始终为数组的方法
BizTalk中确保JSON输出的filters始终为数组的解决方法
针对你遇到的单条过滤记录时filters无法保留数组格式的问题,可通过以下几种方式解决:
1. 修改XML Schema强制数组映射
BizTalk的JSON编码器会根据XML Schema中元素的maxOccurs属性判断是否生成数组。直接在Schema中给filters元素设置maxOccurs="unbounded",同时确保映射时单条记录也映射到该可重复元素:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Root"> <xs:complexType> <xs:sequence> <!-- 配置filters为可重复元素,强制JSON编码器生成数组 --> <xs:element name="filters" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="field" type="xs:string"/> <xs:element name="operator" type="xs:string"/> <xs:element name="value" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
映射时,即使源数据只有一条过滤规则,也要将其映射到filters元素(而非单元素结构),这样生成的XML会包含单个filters节点,JSON编码器会自动将其转为数组格式。
2. 自定义管道组件修正JSON输出
如果Schema修改存在限制,可在JSON编码器之后添加自定义管道组件,直接修改最终的JSON字符串,将非数组形式的filters转为数组:
using System.IO; using System.Text; using Microsoft.BizTalk.Message.Interop; using Microsoft.BizTalk.Component.Interop; using Newtonsoft.Json.Linq; public class EnsureFiltersArrayComponent : IComponent { public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg) { Stream originalStream = pInMsg.BodyPart.GetOriginalDataStream(); string jsonContent = new StreamReader(originalStream).ReadToEnd(); JObject jsonObj = JObject.Parse(jsonContent); // 检查filters是否为非数组类型,转换为数组 if (jsonObj.TryGetValue("filters", out JToken filtersToken) && filtersToken.Type != JTokenType.Array) { jsonObj["filters"] = new JArray(filtersToken); } MemoryStream newStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonObj.ToString())); pInMsg.BodyPart.Data = newStream; pContext.ResourceTracker.AddResource(newStream); return pInMsg; } // 实现IComponent的其他接口方法(略) public void GetClassID(out Guid pClassID) => pClassID = Guid.NewGuid(); public void InitNew() { } public void Load(IPropertyBag pPropBag, int pErrorLog) { } public void Save(IPropertyBag pPropBag, bool pClearDirty, bool pSaveAllProperties) { } }
将该组件添加到发送管道的JSON编码器之后,确保在JSON输出前完成格式修正。
3. 消息赋值中构造XML数组结构
若采用消息赋值手动构建XML,需确保单条filters也以重复元素形式存在,配合Schema的maxOccurs="unbounded"配置,让JSON编码器识别为数组:
<ns0:Root xmlns:ns0="http://YourSchemaNamespace"> <filters> <field>orderId</field> <operator>eq</operator> <value>456</value> </filters> </ns0:Root>
即使只有一条过滤规则,也要保留单个filters节点(而非嵌套的单元素结构),这样JSON编码器会将其转换为"filters": [{"field":"orderId",...}]格式。
内容的提问来源于stack exchange,提问作者mrc85
相关产品推荐
相关产品推荐

