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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:22:28