BizTalk 2016:如何避免空元素映射为JSON中的null值?
BizTalk 2016 移除JSON编码中的null字段解决办法
针对你遇到的自闭合XML元素被JSON编码器转为null的问题,以下是几个实用的解决思路:
方案1:通过架构+映射控制空元素不生成
这是最贴合BizTalk原生流程的方案,核心是不让空元素出现在目标XML中,从根源避免JSON编码出null。
- 调整目标架构:找到对应元素,设置
minOccurs="0"且nillable="false",允许元素可选且不支持空值标记。 - 映射中添加空值判断:
- 拖入一个脚本functoid,编写C#代码判断源元素是否为空:
public bool ShouldGenerateElement(XmlNode sourceNode) { // 判断元素是否有实际内容(非自闭合/空文本) return !string.IsNullOrWhiteSpace(sourceNode.InnerText) || sourceNode.HasChildNodes; } - 将源元素连接到该脚本functoid,再把functoid的输出连接到目标元素的存在性输入(即目标元素左侧的小箭头)。当判断为
false时,目标元素不会被生成。
- 拖入一个脚本functoid,编写C#代码判断源元素是否为空:
方案2:自定义管道组件过滤JSON中的null字段
如果无法修改映射或架构,可以在JSON编码后,用自定义管道组件清理null字段。
- 创建一个新的管道组件,在
Execute方法中处理JSON内容:using System.IO; using Newtonsoft.Json.Linq; using Microsoft.BizTalk.Message.Interop; using Microsoft.BizTalk.Component.Interop; public class RemoveNullJsonFields : IComponent { public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg) { // 读取编码后的JSON内容 Stream originalStream = pInMsg.BodyPart.Data; StreamReader reader = new StreamReader(originalStream); string jsonContent = reader.ReadToEnd(); originalStream.Position = 0; // 解析并移除null字段 JObject jsonObj = JObject.Parse(jsonContent); foreach (var prop in jsonObj.Properties().Where(p => p.Value.Type == JTokenType.Null).ToList()) { prop.Remove(); } // 将清理后的JSON写回消息流 MemoryStream newStream = new MemoryStream(); StreamWriter writer = new StreamWriter(newStream); writer.Write(jsonObj.ToString()); writer.Flush(); newStream.Position = 0; pInMsg.BodyPart.Data = newStream; pContext.ResourceTracker.AddResource(newStream); return pInMsg; } // 实现IComponent的其他接口方法(略) } - 将该组件添加到发送管道中,放在JSON编码器之后的步骤,确保编码后的JSON先被清理再发送。
方案3:使用XSLT映射过滤空元素
将默认BizTalk映射替换为自定义XSLT,直接在转换阶段过滤空元素。
- 导出现有BizTalk映射为XSLT文件。
- 修改对应元素的模板,添加空值判断:
<xsl:template match="sourceElement"> <!-- 仅当元素有非空内容或子元素时,生成目标元素 --> <xsl:if test="normalize-space(.) != '' or *"> <targetElement> <xsl:value-of select="."/> </targetElement> </xsl:if> </xsl:template> - 将修改后的XSLT作为自定义映射导入到BizTalk项目中,替代原有的一对一映射。
注意事项
- 方案1是最优解,因为它遵循BizTalk的消息处理流程,避免后续额外处理。
- 自定义管道组件需要确保引用Newtonsoft.Json(BizTalk 2016默认包含该库),并正确注册到BizTalk服务器。
内容的提问来源于stack exchange,提问作者temp-user
相关产品推荐
相关产品推荐

