json - 从xml转换时获取可用的Json
问题描述
我很难从已从 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"
}
}
}
}
}
}
解决方案
你不会从自动转换器中得到比这更好的东西——事实上我认为它做得很好。
进行比这更好的转换需要人类智能,特别是对数据模型的理解。但这意味着为 XML 的各个部分定义您自己的转换规则。您可以使用 XSLT 轻松实现这一目标。新的数据类型和 JSON 序列化方法使 XSLT 3.0 更容易做到这一点,但也可以在 1.0 或 2.0 中完成,只是需要更多的努力。
推荐阅读
- mysql - mysql 命令行 - 大型 sql 文件 - 不正确的字符串值
- amazon-web-services - AWS 中的 Elastic Beanstalk 仅使用我的 Dockerfile,而不是我的 Docker Compose 文件
- r - 如何在 r 中为多列、子列和统计测试创建列联表?
- r - 如何将图例添加到 ggplot
- ray - 带有reuse_actors=True 的ray.tune 不会调用reset_config
- blazor - Blazor 如何对表中的数据进行排序或升序
- r - 闪亮的三个输入选择变量,它的水平和添加其他列
- python - 如果值高于或低于某个值,则创建阈值并显示文本
- python - 在 json 数据列表中使用 python f-string
- python - Python将if语句与“and”结合起来给出语句预期的错误