【问题标题】:Parsing a XML response back to JSON将 XML 响应解析回 JSON
【发布时间】:2018-10-04 13:55:53
【问题描述】:

我正在处理我必须提出 API 请求的项目。当我向服务器发布 JSON 请求时,我得到以下 XML 作为响应:

"<response>
    \r\n  
    <data>
       \r\n   
        <status no=\"0\" substatus=\"0\">
           Connection succeeded
        </status>\r\n 
    </data>
        \r\n
</response>"

我需要将响应转换回 JSON。但是当我尝试解析它时,我收到一条错误消息

'解析值时遇到意外字符:<.>

我正在使用 NewtonSoftJSON 进行转换。

这是我用来将 XML 字符串转换回 JSON 的代码:

var response = JsonConvert.DeserializeXmlNode(xmlResponse);

我怎样才能做到这一点?

【问题讨论】:

  • 你在response=JsonConvert.DeserializeXmlNode(xmlResponse); 这一行遇到错误了吗?
  • 你不能让服务器返回json给你吗?
  • @Alex ,是的,我在那一行出错了。
  • @rene,但我无权访问服务器
  • 你正在使用的这个 API 正在做的是期待 Xml 节点而不是 Xml,所以使用 Xml Reader 获取每个节点,然后反序列化,然后创建最终的 json

标签: c# json xml


【解决方案1】:

我会对任何期望 JSON 作为输入并返回 XML 作为响应的 webapi 感到非常困惑。但是,如果这确实是您正在查看的内容,那么您需要采用将 XML 响应序列化为 XmlDocument 或更新的 XDocument/XNode 的方法,然后将其中一个实例序列化为 JSON。

XmlDocument 类型有一个使用 XmlReader 的 Load 方法。 (它还提供了LoadXml,但我想在这里展示几个选项)。

XDocument 类型有一个 Parse 方法,它使用 XML 使用字符串。

根据您的示例输入,您可以使用两种方法:

var xml = @"<response>
    <data>
        <status no=""0"" substatus=""0"">
           Connection succeeded
        </status>
    </data>
</response>";

// xmldocument
var xmlReader = XmlReader.Create(new StringReader(xml));
var doc = new XmlDocument();
doc.Load(xmlReader);
var response = JsonConvert.SerializeXmlNode(doc);

response.Dump("XMLDoc to Json "); // LINQPad output

// or XDOcument

response = JsonConvert.SerializeXNode(XDocument.Parse(xml));

response.Dump("XDocument to Json");// LINQPad output

这将是结果:

【讨论】:

  • 感谢@rene,但我可以将 no=\"0\" substatus=\"0\" 替换为 no=""0"" substatus=""0"" 。有办法吗?
  • \" 和 "" 是一样的,只有 \" 用于常规字符串,而 "" 用于逐字字符串。目前尚不清楚您的问题是什么。
  • 感谢您的意见,我会将其标记为答案。
【解决方案2】:

没有从 XML 到 JSON 的直接转换。你应该使用 XML 解析器来处理这个响应。

解析 XML (C#):

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/parsing-xml

我还建议阅读更多关于序列化的内容,因为这个问题实际上没有意义。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题。 rene 的回答有助于弄清楚如何从 xml 转换为 json。但问题在于我的反应。我可以通过从响应中删除 /" 和不需要的双引号来修复它。

     response = response.Replace("<response>\"", "<response>")
                     .Replace("\"<response>", "<response>")
                     .Replace("\\", "")
                     .Replace("rn", string.Empty);
    
    var xmlReader = XmlReader.Create(new StringReader(response));
    var doc = new XmlDocument();
    doc.Load(xmlReader);
    
    var jsonResponse = JsonConvert.SerializeXmlNode(doc);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      相关资源
      最近更新 更多