BizTalk jsonencodes null-boolean 为空字符串

BizTalk jsonencodes null-boolean to empty string

我们的 Dynamics CRM 系统导出一个包含布尔元素的实体。元素可以具有的值是:true、false 和 null。如果不知道元素是否机密,则使用 null 值。例如 Dynamics 将导出以下 xml:

<SecretPhone>true</SecretPhone>
<SecretEmail>false</SecretEmail>
<SecretAddress i:nil = "true">

然后,当 BizTalk 使用带 json 编码器管道的 SB 消息传递适配器将其发送到 Azure Servicebus 中的主题时,结果如下:

{
  "SecretPhone": true,
  "SecretEmail": false,
  "SecretAddress": ""
}

我本以为 null 布尔值是 null 而不是空字符串:

{
  "SecretPhone": true,
  "SecretEmail": false,
  "SecretAddress": null
}

我尝试通过以下方式映射到目标 xml

<SecretAddress i:nil = "true" /> maps to <SecretAddress />

这导致 json 中的空字符串。 (SecretAddress: "")

我也试过这样映射:

<SecretAddress i:nil = "true"> maps to <SecretAddress i:nil = "true" />

但这会导致更加陌生 json

    "SecretAddress": {
      "@nil": "true"
    },

我们正在使用 BizTalk 2020 CU3。 Sandro Pereira 构建了一个自定义的 JsonEncoder 管道组件,它可以覆盖内置的 JsonEncoder,所以我可能需要使用它。我现在的解决方法是将 null 布尔值映射到 false,但这会改变发送到目标系统的数据。

还有其他方法可以json将空 xml 布尔值编码为空 json 值吗?

由于圣诞假期,花了一些时间,然后等待测试人员的反馈。在阅读了@Dijkgraaf 对他在上面评论中链接到的问题的回答后,我设法解决了这样的问题:

目标模式中的所有布尔元素都将 nillable 属性设置为 true。然后在 BizTalk 映射中,我使用带有内联 xslt 的脚本函数来映射布尔元素:

<xsl:variable name="boolEmail" select="/SecretEmail"/>
<xsl:choose>
    <xsl:when test="$boolEmail=''">
            <SecretEmail/>
    </xsl:when>
    <xsl:otherwise>
            <SecretEmail>
              <xsl:value-of select="$boolEmail" /> 
            </SecretEmail>
    </xsl:otherwise>
</xsl:choose>

有了这个,我现在可以在目标消息中得到 true、false 和 null json 值。