【问题标题】:Sending JSON with numeric and guid attribute names发送带有数字和 guid 属性名称的 JSON
【发布时间】:2019-11-09 00:55:19
【问题描述】:

我必须从 BizTalk 发送一个如下所示的 JSON 文件。

[
    {
        "attr": {
            "b587d548-8aa6-42b7-b292-0f3e13452c35": {
                "1": "-2.073420455529934786"
            }
        },
        "guid": "80974561-a449-4a94-8b3e-970822b84406",
        "anotherGuid": "05060c4c-f0af-46b8-810e-30c0c00a379e",
        "lastModified": "2019-11-09T01:44:34.157Z",
        "attributes":
        {
            "4": "2019-11-05T20:30:57.6Z",
            "8": "6",
            "10": "8",
            "13": "7",
            "27": "3",
            ...
        },
        ...
    }
]

在 BizTalk 架构中,我无法定义这样的内容。 attr 中的 Guidattributes 中的数字属性名称不固定,可能是其他值。

我想实现一个自定义管道组件,将 BizTalk XML 转换为输出 JSON。但我不知道如何解决属性名称的问题,因为这些不是有效的 XML 名称。

解决这个问题的最优雅的方法是什么?

提前致谢。

更新更多信息

要获得像上面那样的JSONXML 必须是无效的

<root>
    <element>
        <anotherGuid>05060c4c-f0af-46b8-810e-30c0c00a379e</anotherGuid>
        <attr>
            <b587d548-8aa6-42b7-b292-0f3e13452c35>
                <1>-2.073420455529934786</1>
            </b587d548-8aa6-42b7-b292-0f3e13452c35>
        </attr>
        <attributes>
            <10>8</10>
            <13>7</13>
            <27>3</27>
            <4>2019-11-05T20:30:57.6Z</4>
            <8>6</8>
        </attributes>
        <guid>80974561-a449-4a94-8b3e-970822b84406</guid>
        <lastModified>2019-11-09T01:44:34.157Z</lastModified>
    </element>
</root>

要获得有效的XML,我必须更改无效元素,即,而不是&lt;4 /&gt;,可能是&lt;e4 /&gt;&lt;element name="4" /&gt; 或类似的东西。然后解析器(或其他?)必须将此 XML 元素映射到正确的 JSON 元素。

【问题讨论】:

  • 您的问题到底是什么?您标记了您的问题c#,您的问题是,如何生成像 c# 中所示的 JSON 文件? 是吗,如何反序列化所示的 JSON 文件在 c# 中? 还是关于将 XML 转换为 JSON?
  • 你为什么关心 XML?为什么不直接定义一个合适的 c# 模型并将其序列化为 JSON?由于您需要在此处转换的 XML 格式不正确,因此似乎没有帮助。
  • 内部 BizTalk 仅适用于 XML。没有其他可能。我能做的是在发送之前获取输出流,并在管道组件中用 C# 做一些事情。即我可以将 XML 反序列化为 C# 对象并将其序列化为 JSON。但是我的 XML 不会给出有效的对象,因为不允许使用像 public string 4 { get; set; } 这样的东西。重要的是我最后得到了显示的 JSON。如果 XML 看起来不同,但会被序列化为这个 JSON 就可以了。我不知道序列化程序如何从 XML 或 C# 对象创建这个 JSON。
  • 问题中显示的“XML”是 BizTalk 写入输出流的实际 XML 吗?因为它不是,正如你所注意到的,格式正确。如果没有,您能否分享一个实际 XML 的示例?或者您是否正在尝试设计可以转换为使用 c# 显示的 JSON 的 XML?
  • @dbc BizTalk 有一些组件可以将 xml 转换为不同的消息格式,如平面文件和 json。提问者试图弄清楚如何仍然利用这些组件。另请参阅他试图利用的JsonEncoder Classdocs.microsoft.com/en-us/dotnet/api/…

标签: json biztalk biztalk-pipelines biztalk-schemas


【解决方案1】:

创建一个 xsd 模式,它会产生类似下面的内容。我所做的只是将复杂的东西作为一个简单元素的值,比如attrattributes 元素。我不确定 JSON 编码器是否会接受这样的值,但我想值得一试。

唯一的缺点是您的转换会稍微复杂一些,因为您需要部分生成 JSON。但我觉得这将是一种优雅的解决方法,因为您仍在充分利用库存组件。

<element>
    <anotherGuid>05060c4c-f0af-46b8-810e-30c0c00a379e</anotherGuid>
    <attr>
        b587d548-8aa6-42b7-b292-0f3e13452c35": {
            "1": "-2.073420455529934786"
        }
    </attr>
    <attributes>
        "4": "2019-11-05T20:30:57.6Z",
        "8": "6",
        "10": "8",
        "13": "7",
        "27": "3"
    </attributes>
    <guid>80974561-a449-4a94-8b3e-970822b84406</guid>
    <lastModified>2019-11-09T01:44:34.157Z</lastModified>
</element>

【讨论】:

    【解决方案2】:

    我找到了解决这个问题的方法,但不是最初想要的那种。

    数据是从存储过程中接收的。这是我作为 XML 得到的,并想从问题中将其转换为 JSON。因为无法从相应的 XML 创建像这样的 JSON(这将不是格式正确的),所以我认为这些问题没有一个干净的解决方案。我让这个问题打开,以防万一有很好的可能性。

    现在我通过以下方式解决了它。 我有一个存储过程,它现在将数据作为 JSON 提供。因为 BizTalk 仅适用于 XML,所以此 JSON 包含在 XML 结构中。然后我编写了一个自定义管道组件,它从 XML 中提取 JSON 并将其从 BizTalk 传输到目标系统。所以我得到了没有从 XML 序列化的 JSON 结构。

    这更像是一种解决方法,但效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2019-10-08
      • 2012-05-12
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多