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

时间:2011-05-09 17:46:51

标签: c# web-services json asmx deserialization

好的,我知道我必须遗漏一些简单的东西。

谢谢你的帮助!

[已编辑澄清]

我遇到的问题是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" /> 

3 个答案:

答案 0 :(得分:1)

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

请注意JSON序列化 ResultSet

之间的区别
{
   "Query": "ibm",
   "Result": [ ... ]
}

包含ResultSet的JSON序列化对象

{
   "ResultSet":
   {
      "Query": "ibm",
      "Result": [ ... ]
   }
}

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

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

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

public class ResultSetWrapper
{
    public ResultSet ResultSet;
}

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

return serializer.Deserialize<ResultSetWrapper>(json);

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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