C# ASP.NET Web 服务 - 尝试反序列化 JSON 并获取空对象

本文关键字:JSON 反序列化 获取 对象 NET ASP Web 服务 | 更新日期: 2023-09-27 17:56:08

好吧,我知道我一定错过了一些简单的东西。

感谢您的帮助!

[编辑以澄清]

我遇到的问题是 JSON 输入没有正确反序列化或其他东西,并且给了我一个空的 XML 结果。我想要XML格式的输出,我只是不希望它是空白的。

该代码是我实际代码的简化版本。在我的真实代码中,我正在从另一个网站检索 JSON,并尝试解析它并在 XML soap 请求中返回它。

为了简化事情,我以 JSON 字符串为例,并简单地对其进行硬编码。

[WebService(Namespace="my.soap")]
public class StockQuote : WebService
{
  [WebMethod(Description="",EnableSession=false)]
  public ResultSet IBM()
  {
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string json = "{'"ResultSet'":{'"Query'":'"ibm'",'"Result'":[{'"symbol'":'"IBM'",'"name'": '"International Business Machines Corp.'",'"exch'": '"NYQ'",'"type'": '"S'",'"exchDisp'":'"NYSE'",'"typeDisp'":'"Equity'"},{'"symbol'":'"IBM.F'",'"name'": '"IBM'",'"exch'": '"FRA'",'"type'": '"S'",'"exchDisp'":'"Frankfurt'",'"typeDisp'":'"Equity'"},{'"symbol'":'"IBM.DE'",'"name'": '"IBM'",'"exch'": '"GER'",'"type'": '"S'",'"exchDisp'":'"XETRA'",'"typeDisp'":'"Equity'"},{'"symbol'":'"^AXI'",'"name'": '"Stlmt ID - NASDAQ OMX Alpha IBM'",'"exch'": '"NAS'",'"type'": '"I'",'"exchDisp'":'"NASDAQ'",'"typeDisp'":'"Index'"},{'"symbol'":'"^IVSPY'",'"name'": '"NASDAQ OMX Alpha IBM vs. SPY'",'"exch'": '"NAS'",'"type'": '"I'",'"exchDisp'":'"NASDAQ'",'"typeDisp'":'"Index'"},{'"symbol'":'"IBMSX'",'"name'": '"Invesco Multi-Sector B'",'"exch'": '"NAS'",'"type'": '"M'",'"exchDisp'":'"NASDAQ'",'"typeDisp'":'"Fund'"},{'"symbol'":'"IBM.BE'",'"name'": '"IBM'",'"exch'": '"BER'",'"type'": '"S'",'"exchDisp'":'"Berlin'",'"typeDisp'":'"Equity'"},{'"symbol'":'"IBM.SG'",'"name'": '"IBM'",'"exch'": '"STU'",'"type'": '"S'",'"exchDisp'":'"Stuttgart'",'"typeDisp'":'"Equity'"},{'"symbol'":'"IBM.BA'",'"name'": '"International Business Machines Corp.'",'"exch'": '"BUE'",'"type'": '"S'",'"exchDisp'":'"Buenos Aires'",'"typeDisp'":'"Equity'"},{'"symbol'":'"IBM.L'",'"name'": '"International Business Machines Corp.'",'"exch'": '"LSE'",'"type'": '"S'",'"exchDisp'":'"London'",'"typeDisp'":'"Equity'"}]}}";
    return serializer.Deserialize<ResultSet>(json);
  }
}
[Serializable]
public class ResultSet
{
  public string Query;
  public ResSet[] Result;
}
[Serializable]
public class ResSet
{
  public string symbol;
  public string name;
  public string exch;
  public string type;
  public string exchDisp;
  public string typeDisp;
}

我得到的是 Web 服务返回的以下内容,而不是格式化的对象:

 <?xml version="1.0" encoding="utf-8" ?> 
    <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="my.soap" /> 

C# ASP.NET Web 服务 - 尝试反序列化 JSON 并获取空对象

JSON 字符串表示具有名为 ResultSet 的属性的对象,其中包含嵌套数据。

请注意 JSON 序列化结果集之间的区别:

{   "查询": "ibm",   "结果": [ ... ]}

以及一个包含结果集的 JSON 序列化对象:

{   "结果集":   {      "查询": "ibm",      "结果": [ ... ]   }}

换句话说,如果您从输入字符串中省略ResultSet,它将起作用:

string json = @"{"Query":"ibm","Result":[ ... ]}";

或者,如果将字符串反序列化为具有名为 ResultSet 的属性的类:

public class ResultSetWrapper
{
    public ResultSet ResultSet;
}

在这种情况下,您将需要使用:

return serializer.Deserialize<ResultSetWrapper>(json);

请注意,[Serializable]属性与 XML 序列化无关,也不是必需的。若要控制XmlSerializer的输出,请使用 System.Xml.Serialization 命名空间中的属性。

尝试在webmethod下添加[ScriptMethod(ResponseFormat = ResponseFormat.Json)],如下所示:

[WebMethod(Description="",EnableSession=false)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

您的 Web 服务尚未配置为输出 JSON,它是针对 XML 进行的设置。 请参阅此SO帖子,了解如何设置它。