4

次のコードからのJSON応答は、以下に説明するように誤ってエスケープされます。

私の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応答ヘッダーで、JSON応答が次のように誤って(?)エスケープされていることがわかります。

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

奇妙なのは、コンソールの印刷が正常であるということです(ただし、まだ{d:...}にカプセル化されていません

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

同様のコードで、基本型(オブジェクトなし)を返す[WebMethod]を呼び出すと、JSON応答は問題ありません。好き:

{"d":8080}

4

2 に答える 2

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を事前にシリアル化してから、再度シリアル化していました:(

于 2009-05-01T13:51:12.330 に答える
3

JavaScriptConvert.SerializeObject を呼び出すのはなぜですか?

メソッドの戻り値の型を pu.getMyObject() によって返される型に変更するだけで、あとはフレームワークが処理してくれるのではないでしょうか?

言い換えると...

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

    ...

    return pu.GetMyObject();
}

現時点では、オブジェクトを JSON 形式にシリアル化していると思います。メソッドから戻ると、フレームワークはその文字列 (JSON 形式のデータを含む) を JSON 形式にシリアル化しています。

于 2009-05-01T13:43:55.203 に答える