BizTalk 解码器管道组件在管道配置(在 BizTalk 管理控制台中)显示 RootNode 和 RootNodeNamespace 的值。
当我不指定根时,它会爆炸并说: "原因:Json 解码器属性中未指定根节点名称">
当我指定根时,它会被添加。但是,如果我的 JSON 中有"根",为什么需要添加根?
示例 JSON:
{ "AppRequest": {
"DocumentName": "whatever",
"Source": "whatever"
}
}
所以我想使用上面的 JSON,并有一个根目录为"AppRequest"的架构。 但是,如果我删除一个带有此 JSON 的文件,并将 AppRequest 指定为根,那么我会在我已经拥有的 AppRequest 周围获得一个额外的 AppRequest 包装器。
对我来说,这是一种奇怪的行为,如果你想有一个模式/契约优先的方法。 我可能会与我的贸易合作伙伴就 JSON 达成一致,然后稍后在 BizTalk 中构建架构;现在我被锁定在一个带有根的架构中,并且它下面再次具有相同名称的元素。
此外,构建 JSON 的人可能正在反序列化一个类,因此类名将是该 JSON 文件的"根"。
是的,我可以编写自己的解码器管道组件...只是想弄清楚他们为什么这样做,或者我是否错过了一些明显的东西。
是的,JSON 解码器需要根节点和命名空间。
这是有原因的。JSON 不需要等效的根节点,而 XML 需要根节点。 使其成为必需属性可消除有关转换的任何歧义。 就是这么简单。
由于您通常还需要使用XML 反汇编程序,因此您可以通过使用与 JSON 编码器根节点匹配的信封架构对内容进行去批处理来剥离 JSON 编码器添加的 rood 节点。 您也可以删除 Xml 命名空间,这也是一个好主意。