在将Json转换为XML时,是否有防止重复XML节点的方法?
我使用JsonConvert将Json对象反序列化为XML,但由于Json在同一级别的元素中具有不同的结构,因此在生成的XML中会得到重复的节点 我的Json如下所示:在将Json转换为XML时,是否有防止重复XML节点的方法?,xml,json,json.net,deserialization,Xml,Json,Json.net,Deserialization,我使用JsonConvert将Json对象反序列化为XML,但由于Json在同一级别的元素中具有不同的结构,因此在生成的XML中会得到重复的节点 我的Json如下所示: { "shipments": [ { "id": "A000001", "name": "20141208 140652", "type": "OUTLET", "date": "2014-12-08 14:0
{
"shipments": [
{
"id": "A000001",
"name": "20141208 140652",
"type": "OUTLET",
"date": "2014-12-08 14:06:52",
"status": "SENT",
"received_at": null,
"created_at": "2014-12-08 14:06:52",
"updated_at": null,
"outlet_id": "SH000064"
},
{
"id": "A000002",
"name": "20141204 122650",
"type": "SUPPLIER",
"date": "2014-12-04 12:26:50",
"outlet_id": "SH000064",
"supplier_id": null,
"status": "RECEIVED",
"received_at": "2014-12-04 12:28:43",
"created_at": "2014-12-04 12:26:50",
"updated_at": "2014-12-04 12:28:43"
}
]
}
<root>
<shipments>
<id>A000001</id>
<name>20141208 140652</name>
<type>OUTLET</type>
<date>2014-12-08 14:06:52</date>
<status>SENT</status>
<received_at />
<created_at>2014-12-08 14:06:52</created_at>
<updated_at />
<outlet_id>SH000064</outlet_id>
</shipments>
<shipments>
<id>A000002</id>
<name>20141204 122650</name>
<type>SUPPLIER</type>
<date>2014-12-04 12:26:50</date>
<outlet_id>SH000064</outlet_id>
<supplier_id />
<status>RECEIVED</status>
<received_at>2014-12-04 12:28:43</received_at>
<created_at>2014-12-04 12:26:50</created_at>
<updated_at>2014-12-04 12:28:43</updated_at>
<outlet_id>SH000064</outlet_id>
</shipments>
</root>
转换后,XML如下所示:
{
"shipments": [
{
"id": "A000001",
"name": "20141208 140652",
"type": "OUTLET",
"date": "2014-12-08 14:06:52",
"status": "SENT",
"received_at": null,
"created_at": "2014-12-08 14:06:52",
"updated_at": null,
"outlet_id": "SH000064"
},
{
"id": "A000002",
"name": "20141204 122650",
"type": "SUPPLIER",
"date": "2014-12-04 12:26:50",
"outlet_id": "SH000064",
"supplier_id": null,
"status": "RECEIVED",
"received_at": "2014-12-04 12:28:43",
"created_at": "2014-12-04 12:26:50",
"updated_at": "2014-12-04 12:28:43"
}
]
}
<root>
<shipments>
<id>A000001</id>
<name>20141208 140652</name>
<type>OUTLET</type>
<date>2014-12-08 14:06:52</date>
<status>SENT</status>
<received_at />
<created_at>2014-12-08 14:06:52</created_at>
<updated_at />
<outlet_id>SH000064</outlet_id>
</shipments>
<shipments>
<id>A000002</id>
<name>20141204 122650</name>
<type>SUPPLIER</type>
<date>2014-12-04 12:26:50</date>
<outlet_id>SH000064</outlet_id>
<supplier_id />
<status>RECEIVED</status>
<received_at>2014-12-04 12:28:43</received_at>
<created_at>2014-12-04 12:26:50</created_at>
<updated_at>2014-12-04 12:28:43</updated_at>
<outlet_id>SH000064</outlet_id>
</shipments>
</root>
问题在于第二个装运元素中的outlet_id节点重复。输入Json通过了验证,所以我认为这是一个常见问题。有办法绕过它吗
更新:进一步调试表明,在提交和处理HttpWebRequest期间引入了额外的节点。如果我通过Postman应用程序调用REST服务,我会得到上面给出的Json(为了简单起见,使用截断)。如果我通过我的C#代码呼叫服务,我会得到以下信息:
{
"shipments": [
{
"id": "A000001",
"name": "20141208 140652",
"type": "OUTLET",
"date": "2014-12-08 14:06:52",
"status": "SENT",
"received_at": null,
"created_at": "2014-12-08 14:06:52",
"updated_at": null,
"outlet_id": "SH000064"
},
{
"id": "A000002",
"name": "20141204 122650",
"type": "SUPPLIER",
"date": "2014-12-04 12:26:50",
"outlet_id": "SH000064",
"supplier_id": null,
"status": "RECEIVED",
"received_at": "2014-12-04 12:28:43",
"created_at": "2014-12-04 12:26:50",
"updated_at": "2014-12-04 12:28:43",
"outlet_id": "SH000064"
}
]
}
我用于提交请求和处理响应的代码是:
HttpWebRequest request = WebRequest.Create(Uri.EscapeUriString(url)) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
var responseStream = reader.ReadToEnd();
reader.Close();
此阶段的断点显示附加节点已添加到响应流返回的Json中
执行相同的调用时,返回的数据都是相同的类型和结构,不会创建重复的节点,因此这可能是由于一个“装运”元素的结构与其对等元素不同造成的。您的JSON有悬空逗号,这表明您已编辑掉了部分内容。您发布的内容未通过验证(请尝试)。如果我删除了悬空的逗号,并尝试使用您发布的代码将上面显示的JSON转换为XML,那么XML中就不会出现重复的“outlet_id”节点。如果源JSON中已经有重复的数据,我只会得到一个重复的节点。请检查JSON的重复属性。如果您仍然看到这个问题,请提供一个完整的、有效的示例程序进行演示。我已经编辑了我的原始帖子,以显示正确的缩写Json,现在是有效的。如果你通过Postman得到的结果与你的C#代码不同,那么这两个web服务调用之间一定有什么不同。是否每次都传递相同的参数和标题?我建议使用像Fiddler这样的工具来观察HTTP请求和响应实际上是什么。您应该能够识别差异。