C # ASP.NET web service - Попытка десериализации JSON и получение пустого объекта - PullRequest
0 голосов
/ 09 мая 2011

Хорошо, я знаю, что, должно быть, упускаю что-то простое.

Спасибо за вашу помощь!

[ИЗМЕНЕНО, чтобы уточнить]

Проблема, с которой я столкнулсяявляется то, что ввод JSON не десериализован должным образом или что-то и дает мне пустой результат XML.Я хочу вывод в формате XML, я просто не хочу, чтобы он был пустым.

Код является упрощенной версией моего фактического кода.В своем реальном коде я получаю JSON с другого веб-сайта и пытаюсь проанализировать его и вернуть в XML-запросе на мыло.

Чтобы упростить задачу, я взял строку 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;
}

Я получаю следующее, возвращаемое веб-службой вместо отформатированного объекта:

 <?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 ]

1 голос
/ 09 мая 2011

Ваша строка 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 .

0 голосов
/ 09 мая 2011

Ваш веб-сервис не настроен на вывод JSON, он настроен для XML.См. SO пост о том, как его настроить.

0 голосов
/ 09 мая 2011

попробуйте добавить [ScriptMethod (ResponseFormat = ResponseFormat.Json)] в веб-метод, например, так:

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