从 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 消息的方式从中提取值。
我的问题是:
- 这是自动生成的 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"
}
}
}
}
}
}
没有比这更好的自动转换器了——事实上,我认为它做得很好。
比这更好的转换需要人类的智慧,尤其是对数据模型的理解。但这意味着要为 XML 的各个部分定义自己的转换规则。使用 XSLT 可以很容易地实现这一点。新的数据类型和 JSON 序列化方法使 XSLT 3.0 更容易做到这一点,但它也可以在 1.0 或 2.0 中完成,只是需要更多的努力。
我很难从 JSON 获取数据,这些数据已从 XML 自动转换而来,希望有专业知识来确定实现我的目标的最佳方法。
我有一条 xml 消息,是我从 restful 服务中读取的。 我在 post 底部包含了 xml 消息的简短匿名版本以供参考。 消息是关于一个人的详细信息,一个人可以有多个地址。 每个地址可以有 0 到 6 个地址行,如果没有填写地址行值,系统不会将它们包含在 xml 文档中。
我使用 json() 函数将其转换为 Json。 然后我解析 json 以使这些值易于访问。
这是我遇到的问题。
当我使用 json() 函数将消息转换为 Json 时,我得到以下 Json 架构(请参阅 post 的底部)。 请注意,地址不是数组格式,实际上 none 是数组格式。
我不确定如何以适用于非此特定消息的其他 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"
}
}
}
}
}
}
没有比这更好的自动转换器了——事实上,我认为它做得很好。
比这更好的转换需要人类的智慧,尤其是对数据模型的理解。但这意味着要为 XML 的各个部分定义自己的转换规则。使用 XSLT 可以很容易地实现这一点。新的数据类型和 JSON 序列化方法使 XSLT 3.0 更容易做到这一点,但它也可以在 1.0 或 2.0 中完成,只是需要更多的努力。