2009-05-01 4 views
4

Ответ JSON из следующего кода ошибочно экранирован, как описано ниже.Исключенный ответ JSON с [WebMethod]

Мой WebMethod как это:

[WebMethod (Description="doc here")] 
    [ScriptMethod(ResponseFormat=ResponseFormat.Json)] 
    public string responseMyObject() { 
      if (!Setup()) return ""; 

      ... 
      Proxy pu = new Proxy(...); 
... 

      string toReturn = JavaScriptConvert.SerializeObject(pu.getMyObject()); 
      Console.WriteLine(toReturn); 
      return toReturn; 
    } 

из консоли я получаю:

{"field1":vaule1,"field2":value2} 

от JS:

$.ajax({ 
    type: "POST", 
    url: "/myapi/myClass.asmx/responseMyObject", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
        var object = msg.d; 
        alert(object.field1); 
    } 
}); 

Проблема заключается в том, что в заголовке ответа HTTP I может видеть, что ответ JSON ошибочно (?) экранирован следующим образом:

{"d":"{\"field1\":value1,\"field2\":value2}"} 

Что странно, что консоль печати отлично (но еще не воплощен в {D: ...}

{"field1":value1,"field2":value2} 

С подобным кодом, если я называю [WebMethod], который возвращает основные типы (нет объекта) ответ JSON в порядке. Как:

{ "d": 8080}

+1

JSON не ошибается, он сбежал правильно –

+1

он взят ваш JSON (String) и завернут его в обертку объекта JSON –

+0

Можете ли вы дать нам более подробную информацию на тип, возвращаемый getMyObject()? Он может указать причину такого поведения. –

ответ

3

Почему вы называете JavaScriptConvert.SerializeObject?

Не можете ли вы изменить тип возвращаемого вами метода как тип, возвращаемый pu.getMyObject(), а структура сделает все остальное?

Других слов ...

[WebMethod (Description="doc here")]  
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]  
public MyObjectType responseMyObject() 
{ 
    Proxy pu = new Proxy(...); 

    ... 

    return pu.GetMyObject(); 
} 

На данный момент я думаю, что вы сериализация вашего объекта в формат JSON, а затем, когда вы вернетесь из метода, каркас сериализация этой строки (которая содержит форматированные данные JASON) в формате JSON.

+0

Теперь response is empty {} – 2009-05-01 14:01:10

6
[WebService] 
[ScriptService] 
public class MyWebService : WebService 
{  

    [WebMethod (Description="doc here")]  
    [ScriptMethod(UseHttpGet=false, ResponseFormat=ResponseFormat.Json)]  
    public MyObjectType responseMyObject() 
    { 
     Proxy pu = new Proxy(...); 

     return pu.GetMyObject(); 
    } 

} 

Вам не нужно JSON сериализатор, мечения его с атрибутом ScriptService дает возможность связать это сериализации JSON из. Вы предварительно сериализовали JSON, а затем сериализовали его снова :(

+0

Теперь ответ пустой {} – 2009-05-01 14:01:18

+0

ваш объект действительно имеет свойства? И установили System.Web.Extensions? 3.5 sp1 добавляет много вещей –

+0

ваши имена field1, заставляет меня думать, что они являются полями , измените свойство и отпустите его –

Смежные вопросы