簡體   English   中英

C#ASP.NET Web服務-嘗試反序列化JSON並獲取一個空對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM