从 xml 转换时获得可用的 Json

Obtaining usable Json when converting from xml

我很难从 JSON 获取数据,这些数据已从 XML 自动转换而来,希望有专业知识来确定实现我的目标的最佳方法。

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

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

这是我遇到的问题。

当我使用 json() 函数将消息转换为 Json 时,我得到以下 Json 架构(请参阅 post 的底部)。 请注意,地址不是数组格式,实际上 none 是数组格式。

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

我的问题是:

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"
          }
        }
      }
    }
  }
}

没有比这更好的自动转换器了——事实上,我认为它做得很好。

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