[英]C# ASP.NET web service - Trying to deserialize JSON and getting an empty object
好吧,我知道我一定缺少简单的东西。
谢谢您的帮助!
[编辑以澄清]
我遇到的问题是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" />
您的JSON字符串表示一个对象,该对象具有名为ResultSet
的属性,其中包含嵌套数据。
注意JSON序列化ResultSet之间的区别:
{ "Query": "ibm", "Result": [ ... ] }
还有一个JSON序列化对象,其中包含ResultSet :
{ "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命名空间中的属性。
尝试在网络方法下添加[ScriptMethod(ResponseFormat = ResponseFormat.Json)],如下所示:
[WebMethod(Description="",EnableSession=false)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
您的Web服务尚未配置为输出JSON,而是XML的设置。 请参阅此SO帖子,了解如何设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.