ASP.NET WebMethod Возвращает JSON, заключенный в кавычки - PullRequest
7 голосов
/ 08 июня 2010

У меня есть страница asp.net с WebMethod для передачи JSON обратно в мой javascript.

Ниже приведен веб-метод:

[WebMethod]
public static string getData(Dictionary<string, string> d) {

    string response = "{ \"firstname\": \"John\", \"lastname\": \"Smith\" }";

    return response;

}

Когда это возвращается клиенту, оно форматируется следующим образом:

{ \"d\": \"{ \"firstname\": \"John\", \"lastname\": \"Smith\" }\" }

Проблема в двойных кавычках, заключающих все в «d». Есть ли что-то, что я пропустил в веб-методе или каком-либо другом способе возврата данных без кавычек? Я на самом деле не хочу, чтобы это каждый раз раздевали на клиенте. Также я видел другие статьи, где этого не происходит.

Любая помощь будет оценена спасибо.

Ответы [ 3 ]

8 голосов
/ 09 июня 2010

Я предполагаю, что вы хотите вернуть JSON-представление объекта

 {
    firstname:"John",
    lastname:"Smith"
 }

но подпись вашего метода возвращает строку. Сериализация фреймворка ASP.Net правильно сериализация строки response. Другими словами, если ваша функция была

string response = "foo";
return response; 

Вы не удивитесь, если результат будет

{"d":{"foo"}}

Просто так получается, что response имеет двойные кавычки, которые нужно экранировать.

Вы, очевидно, просто хотите добраться до объекта. У вас есть 2 варианта: -

1) используйте eval в вашем javascript, чтобы превратить строку в объект, например.

function onSuccessCallback(retval) {
     var obj = eval(retval.d);
}`

2) или (и это мое предпочтительное решение) ваш метод возвращает реальный объект и позволяет сериализации JSON фреймворка сделать тяжелую работу за вас

[WebMethod]
public static object getData(Dictionary<string, string> d) {
    var response = new { firstname = "John", lastname="Smith" };
    return response;
}

Вы увидите, что это генерирует ответ, который вы, вероятно, изначально ожидали (например, {"d":{"firstname":"John", "lastname":"Smith"}}

3 голосов
/ 08 мая 2013

На самом деле вся эта проблема существует, потому что вы пытаетесь перехитрить веб-сервисы ASP.Net. Вам нужно настроить класс для ваших данных, которые будут возвращаться, и использовать этот класс (или List (из YourClass)), чтобы поставить в очередь результаты и вернуть их.

Отличная статья, объясняющая все это (очень распространенная ошибка): http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

0 голосов
/ 19 мая 2014

У меня была похожая проблема с моим кодом. Я пытался вернуть XmlDocument как JSON вызывающему скрипту, но возвращение XmlDocument из WebService вернуло пустой набор массивов (поскольку XmlDocument НЕ сериализуем!)

Если я установил ScriptService с атрибутом ResponseFormat.JSON, то мой JSON был дважды экранирован.

Путь к обману ASP.NET заключается в том, чтобы сообщить ASP.NET, что вы возвращаете XML, и тогда он не будет дважды выходить из JSON; -)

    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
    public String MyJSONWebService(String sParam1, String sParam2, String sParam3)
    {
       ... do stuff.....
       XmlDocument oXMLDocument = new XmlDocument();
       oXMLDocument.LoadXml(sXML);
       sJSON = JsonConvert.SerializeXmlNode(oXMLDocument.SelectSingleNode("autnresponse"));
       return sJSON;
    }

Я знаю, что это взлом, но .....

...