【问题标题】:Obtaining usable Json when converting from xml从xml转换时获取可用的Json
【发布时间】:2020-07-11 22:24:16
【问题描述】:

我在从自动从 XML 转换的 JSON 中获取数据时遇到困难,希望获得专业知识来确定实现目标的最佳方式。

我有一条从 restful 服务读取的 xml 消息。 我在帖子底部包含了 xml 消息的缩短匿名版本以供参考。 消息是关于一个人的详细信息,一个人可以有多个地址。 每个地址可以有 0 到 6 个地址行,如果地址行值没有填写,系统不会将它们包含在 xml 文档中。

我使用 json() 函数将其转换为 Json。 然后我解析 json 以使值易于访问。

这是我遇到问题的地方。

当我使用 json() 函数将消息转换为 Json 时,我得到以下 Json 模式(见帖子底部)。 请注意,地址不是数组格式,实际上都不是。

我不确定如何以适用于其他非此特定消息的 PersonMessageService 消息的方式从中提取值。

我的问题是:

  • 这个自动生成的 json 是不是很笨重而且不是很实用?
  • 有没有更好的方法在逻辑应用中从 xml 生成 json?
  • 如何在转换后从我的 json 中获取值?

XML 消息

<PersonMessageService version="1.5.3">
<response timestamp="2020-03-31T08:48:42.273557+01:00">
    <status>SUCCESS</status>
    <description/>
    <receipt>A227C1E61EFA2B05E8530100007F6E90</receipt>
</response>
<payload>
    <PersonData>
        <MessageMeta>
            <messageId>123456</messageId>
            <MessageChecksum>c7875a0fd6869bb1234c82bd00712345</MessageChecksum>
        </MessageMeta>
        <personRecord SystemKey="123456789" timestamp="2020-01-31T08:48:35">
            <GUID>9889898</GUID>
            <idNumber>3578951</idNumber>
            <firstName>Joe</firstName>
            <surname>Bloggs</surname>
            <title>Mr</title>
            <gender>M</gender>
            <dateOfBirth>1980-01-01</dateOfBirth>
            <homeAddress addressObjectId="10001" timestamp="2018-11-12T14:58:01">
                <address>
                    <addressLine1>123 Fake St</addressLine1>
                    <country>United States</country>
                </address>
                <email>Joe@bloggs.com</email>
                <mobile>5558878558</mobile>
            </homeAddress>
            <termAddress addressObjectId="10002" timestamp="2018-11-12T15:07:01">
                <address/>
                <email>joebloggs@hotmail.com</email>
            </termAddress>
            <workAddress addressObjectId="10003" timestamp="2018-11-12T15:07:01">
                <address/>
            </workAddress>
            <mailingLabel addressObjectId="10004" timestamp="2018-11-12T14:58:01">
                <address>
                    <addressLine1>58 Fake Bvd</addressLine1>
                    <addressLine2>Fake County</addressLine2>
                    <country>United States</country>
                </address>
            </mailingLabel>
            <referenceNumbers/>
            <personIndicators>
                <country/>
                <nationality/>
                <marketingCorrespondence>N</marketingCorrespondence>
            </personIndicators>
        </personRecord>
    </PersonData>
</payload>

使用 JSON() 函数自动转换为 JSON 后

{
  "PersonMessageService": {
    "@version": "1.5.3",
    "response": {
      "@timestamp": "2020-03-31T08:48:42.273557+01:00",
      "status": "SUCCESS",
      "description": null,
      "receipt": "A227C1E61EFA2B05E8530100007F6E90"
    },
    "payload": {
      "PersonData": {
        "MessageMeta": {
          "messageId": "123456",
          "MessageChecksum": "c7875a0fd6869bb1234c82bd00712345"
        },
        "personRecord": {
          "@SystemKey": "123456789",
          "@timestamp": "2020-01-31T08:48:35",
          "GUID": "9889898",
          "idNumber": "3578951",
          "firstName": "Joe",
          "surname": "Bloggs",
          "title": "Mr",
          "gender": "M",
          "dateOfBirth": "1980-01-01",
          "homeAddress": {
            "@addressObjectId": "10001",
            "@timestamp": "2018-11-12T14:58:01",
            "address": {
              "addressLine1": "123 Fake St",
              "country": "United States"
            },
            "email": "Joe@bloggs.com",
            "mobile": "5558878558"
          },
          "termAddress": {
            "@addressObjectId": "10002",
            "@timestamp": "2018-11-12T15:07:01",
            "address": null,
            "email": "joebloggs@hotmail.com"
          },
          "workAddress": {
            "@addressObjectId": "10003",
            "@timestamp": "2018-11-12T15:07:01",
            "address": null
          },
          "mailingLabel": {
            "@addressObjectId": "10004",
            "@timestamp": "2018-11-12T14:58:01",
            "address": {
              "addressLine1": "58 Fake Bvd",
              "addressLine2": "Fake County",
              "country": "United States"
            }
          },
          "referenceNumbers": null,
          "personIndicators": {
            "country": null,
            "nationality": null,
            "marketingCorrespondence": "N"
          }
        }
      }
    }
  }
}

【问题讨论】:

    标签: json xml azure-logic-apps


    【解决方案1】:

    你不会从自动转换器中得到比这更好的东西 - 事实上我认为它做得很好。

    进行比这更好的转换需要人类智能,尤其是对数据模型的理解。但这意味着为 XML 的各个部分定义您自己的转换规则。您可以使用 XSLT 轻松实现这一目标。新的数据类型和 JSON 序列化方法使 XSLT 3.0 更容易做到这一点,但也可以在 1.0 或 2.0 中完成,只是需要更多的努力。

    【讨论】:

    • 非常有用的信息,谢谢。我将花时间弄清楚 XSLT。关于将xml转换为JSON的路径,这是最好的方法:1.在使用JSON函数之前,仍然使用XSLT将我的xml转换为更好的格式xml。 2. 使用 XSLT 从 XML 直接转换为 JSON 或 3. 还有什么我没有考虑过的?
    • 我认为我自己的偏好是将数据保留在 XML 中,同时进行任何必要的转换,然后作为最后一步转换为 JSON。但其中一些是个人喜好问题,取决于您的工具包中有哪些工具并且最适合使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2020-06-05
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多