2009-05-01 3 views
4

Die JSON-Antwort aus dem folgenden Code wird falsch wie unten beschrieben maskiert.Escaped JSON-Antwort mit [WebMethod]

ist mein Webmethod wie folgt aus:

[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; 
    } 

von der Konsole erhalte ich:

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

von 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); 
    } 
}); 

Das Problem ist, dass ich in der HTTP-Antwort-Header kann sehen, dass die JSON-Antwort auf folgende Weise falsch (?) ist:

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

Was seltsam ist, dass die Konsole Druck in Ordnung ist (aber noch nicht eingekapselt in {d: ...}

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

Mit ähnlichen Code, wenn ich einen Anruf [WebMethod], die Grundtypen zurückgibt (kein Objekt) Die JSON-Antwort ist in Ordnung. Wie:

{ "d": 8080}

+1

Die JSON nicht falsch ist, wird er entkam richtig –

+1

es Ihre JSON (String) genommen hat und wickelte es in ein JSON-Objekt-Wrapper –

+0

Können Sie uns mehr Details geben Auf den Typ, der von getMyObject() zurückgegeben wird? Es könnte den Grund für dieses Verhalten hervorheben. –

Antwort

3

Warum rufst du JavaScriptConvert.SerializeObject?

Können Sie nicht einfach den Rückgabetyp Ihrer Methode als den Typ ändern, der von pu.getMyObject() zurückgegeben wird, und das Framework erledigt den Rest?

Mit anderen Worten ...

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

    ... 

    return pu.GetMyObject(); 
} 

Im Moment denke ich Sie Ihr Objekt in ein JSON-Format sind die Serialisierung und dann, wenn Sie von der Methode zurückgibt, wird der Rahmen die Zeichenfolge Serialisierung (die enthält JASON-formatierte Daten) in ein JSON-Format.

+0

Jetzt die Antwort ist eine leere {} –

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(); 
    } 

} 

Sie brauchen keine JSON Serializer benötigen, ist es mit dem Scriptservice-Attribut Tagging es Fähigkeit JSON aus serialisiert Krawatte gibt. Sie wurden vor die JSON Serialisierung und es dann wieder Serialisierung :(

+0

Nun ist die Antwort eine leere {} –

+0

Ihr Objekt tatsächlich Eigenschaften haben und die System.Web.Extensions installiert? 3.5 SP1 fügt viel Zeug –

+0

Ihre Namen field1, führt mich zu glauben, sie sind Felder Wechseln Sie zu Property und probieren Sie es aus –