Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将Json转换为XML时,是否有防止重复XML节点的方法?_Xml_Json_Json.net_Deserialization - Fatal编程技术网

在将Json转换为XML时,是否有防止重复XML节点的方法?

在将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

我使用JsonConvert将Json对象反序列化为XML,但由于Json在同一级别的元素中具有不同的结构,因此在生成的XML中会得到重复的节点

我的Json如下所示:

{
    "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请求和响应实际上是什么。您应该能够识别差异。