1

次のようなJavascriptオブジェクトがあります。

var jsonDataActual = { 
                       "source": [{
                                    "name": "testCaption0", 
                                    "desc": "testDescrip0", 
                                    "values": [{ 
                                                 "from": "/Date(1338811241074)/", 
                                                   "to": "/Date(1346760041074)/", 
                                                "label": "testLabel0", 
                                          "customClass": "GanttRed"
                                               }] 
                                 }], 
                       "navigate": "scroll", 
                        "scale": "weeks", 
                        "maxScale": "months", 
                        "minScale": "days", 
                    "itemsPerPage": 11, 
                     "onItemClick": function (data) { }, 
                      "onAddClick": function (dt, rowId) { } 

                 };

それは私にとってはうまくいきます。今、私の要件と必要性のために、このオブジェクト全体 (ブレース ie{ } とセミコロン ; を含む) をサーバー側 (C#) の文字列として作成し、サーバー側メソッドを使用して ajax 呼び出し (web メソッド) に返します。

サーバー側の方法では、次のようにします。

return  new JavaScriptSerializer().Serialize(jsonData);

しかし、現在、この返されたデータ全体 ( 内Success: function(msg){ var s=msg.d}) は文字列として扱われるため、機能しません。

私はこれらを試しました:

  1. var obj = eval('{' + msg.d +'}'); (removing beginning and ending braces in msg.d)
         typeof(obj) is string. failed

  2. eval('var obj ='+msg.d);  (including beginning and ending braces in msg.d)
         typeof(obj) is string. failed

  3. var obj= jQuery.parseJson(msg.d);
        typeof(obj) is string. failed
  4. var obj = new Object();
     //var obj = {}; 
      obj=jQuery.parseJson(msg.d).
      typeof(obj) is string. failed.

助けてください。サーバー側で返されたjsonをオブジェクトに変換するにはどうすればよいですか?

なぜそれは私のために働いていないのですか??. 私のjsonオブジェクトの構造が原因ですか??

そして、なぜjsonDataActual私にとってはうまくいくのに、文字列として送信されたときはうまくいかないのですか???

私はこれこれを見ました..

助けてください.....

4

4 に答える 4

2

私の特定の問題の解決策を見つけました。

jsonデータを値として文字列変数を作成していました。そして、この文字列をクライアント側の関数(ajaxリクエストを行う関数)に返します。すなわち

サーバー側の方法

[WebMethod]
public static string GetJsonData()
{
    string jsonData = String.Empty;
    foreach(var dataItem in objEntireData.Items)
    {
         //  jsonData +=  
    }
   return new JavaScriptSerializer().Serialize(result);
} 

しかし、それは機能していませんでした。そのため、文字列変数を作成してシリアル化する代わりに、特定の構造を持つクラスを作成し、returnステートメントで送信しました(シリアル化後)。

つまり、以下のクラスを参照してください

    public class A
    {
        public A()
        {
            Values = new List<B>();
        }
        public string prop1 {get; set;}
        public List<B> Values { get; set; }
    }
    public class B
    {
        public string prop2 { get; set; }
        public string prop3 { get; set; }
    }

そして私はこのクラスを以下のように使用します:

[WebMethod]
public static string GetJsonData()
{
          List<A> objA = new List<A>();
          A objAItem = new A();
          foreach (var dbItem in objDataBaseValues)
          {
                objA.prop1 = "test";
                B objBItem = new B();
                b.prop2="value";
                b.prop3="value";
                objA.Values.Add(objBItem);
          }
        return new JavaScriptSerializer().Serialize(objA);

  }

データ全体をクラス構造にまとめてから、これをシリアル化することでうまくいきました。私のクライアント側関数はそれをオブジェクトとして正常に認識しました。

 $.ajax({
                    type: "POST",
                    url: "ProjectGanttChart.aspx/getData",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        var jsonData = jQuery.parseJSON(msg.d);
                        populateGantt(jsonData);
                     }
          }); 
于 2012-09-12T11:52:14.060 に答える
0

私はこれまで何度もこれに遭遇しました。WCFサービスが返されたデータをJSONに復号化する場合、文字列データの周囲には常に「」が付きます。これらがサービスレベルで作成されたカスタムオブジェクトであっても、常にオブジェクトまたはWCFサービスからのオブジェクトのリストを返す必要があります。

したがって、サービスは次のようになります。

[OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/Test?testId={testId}", RequestFormat = WebMessageFormat.Json,
                   ResponseFormat = WebMessageFormat.Json)]
        List<TestObjectJSON> Test(int testId);

これにより、シリアライザーを使用せずに、サービス側で逆シリアル化が実行されます。

于 2012-09-04T08:02:41.243 に答える
0

これを試して

var json=(typeof msg.d) == 'string' ? eval('(' + msg.d + ')') : msg.d;
于 2012-09-04T07:56:59.957 に答える
0

サーバー側で返されたjsonをオブジェクトに変換するにはどうすればよいですか?

そのために使用できますJSON.parse

例:

a = [1, 2];
x = JSON.stringify(a); // "[1,2]"
o = JSON.parse(x); // [1, 2];
于 2012-09-04T08:04:45.637 に答える