【发布时间】:2019-09-18 09:26:28
【问题描述】:
我从外部来源接收 Json 数据。我需要将 Json 消息转换为 XML。
这个使用NewtonSoft库比较简单:
var placeHolder = $"{{\"Data\": {jsonContent} }} ";
var xmlNode = JsonConvert.DeserializeXmlNode(placeHolder, "Root").OuterXml;
var doc = new XmlDocument();
doc.LoadXml(xmlNode);
我收到的 Json 有一点奇怪的事情破坏了整个过程。
Json 看起来像这样:
[
{
"Type": "Application",
"Object": {
"Duration": 2,
"Request": {
"authReference": "..",
"IdEnrolment": {
"username": "test",
"password": "***",
"createNewUser": false
}
},
"Type": "XXX.SomeController",
"Logs": [
],
"Method": "IdEnrolments",
"Response": {
"IdUsername": null,
"result": {
"resultCode": 0,
"resultTitle": null,
"resultMessage": null
}
}
}
},
{
"Type": "Proxy",
"Object": {
"Assembly": null,
"Policy": null,
"Cache": null,
"Duration": 516,
"Request": "{\"AuthenticateUserRequest\":{\"EnterpriseContext\":{\"ContextInfo\":{\"@xmlns\":\"http://example.xom\",\"ProcessContextId\":\"adad\",\"ExecutionContextId\":\"adac\"}\"}}",
"Type": "https://someserver/services/ent/informationandtechnologymanagement/company/v1",
"Logs": [
],
"Method": "AuthenticateUser",
"Response": "{\"AuthenticateUserResponse\":{\"EnterpriseContext\":{\"ContextInfo\":{\"@xmlns\":\"http://example.com\",\"ProcessContextId\":\"adad\",\"ExecutionContextId\":\"adad\"}}}}"
}
}
]
数组中的第一个对象是完美的并且可以正确序列化。数组中的第二个对象会导致混乱(可以理解)。此对象的请求和响应字段实际上是字符串,它们包含 JSON 代码。
有没有办法正确反序列化?我意识到要求图书馆足够灵活地做到这一点是很多事情 - 但我只是对如何使用它有点困惑。
我收到的所有消息看起来都大致相同 - 但具体而言,请求和响应对象的内容根据具体的请求/响应而有所不同。
构建这个的人没有任何类型的架构或合同,除了他们发送 Json 文本而且他们似乎不愿意或无法更改 Json 的创建方式。
任何建议都将不胜感激。
注意:这种行为似乎不是随机的。我得到的是正确的对象还是字符串由属性决定:“Type”:“Application”。有许多不同的“类型” - 有些是正确序列化的,有些则不是...... Aaarrggghhhh !!!!沮丧!!!!
【问题讨论】:
-
正确反序列化 正确是什么意思?正如您已经说过的,
Request是一个包含 json 的字符串,因此正确地将其反序列化为一个字符串。如果你想把这个字符串变成一个对象,那么你需要在那个字符串上运行第二次反序列化 -
有许多库可以将 XML 转换为 JSON,反之亦然。他们的做法都略有不同,而且在所有可能的情况下,他们都没有完全按照您的意愿行事。您需要习惯这样的想法,即您必须通过预处理输入或后处理输出来自定义转换。
-
@Liam,从技术上讲,您将字符串反序列化为字符串是正确的,但该字段是字符串,因为有人错误地构建了 JSON 以配合使用。所以,我对“正确”的看法是对象视图。这就是 JSON“应该看起来像”的样子。我并没有对序列化程序进行抨击,我实际上只是在寻找解决方案。
-
@Michael Kay,我希望众多 JSON 序列化程序之一可能已经处理了这个问题,但是,预处理和双序列化方法可能是唯一的选择。如果更聪明的人有更好的主意,我只是不想这样做……谢谢大家的回复。非常感谢。
-
那么答案是首先正确地“构建 JSON”