2012-03-28 55 views
1

我真的是JSON的新手,但這裏是我得到的。我需要創建一個包含數組/列表和一對平坦字段的對象。例如:構建,發送和反序列化一個包含數組的json對象

var names= new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 

我那麼字符串化,並嘗試通過AJAX將其發送到一個PageMethod的:

var jsonData = JSON.stringify(obj); 
sendData(obj); 

然後發送:

function sendData(jsonData) { 
    $.ajax({ 
     type: "POST", 
     url: "Default.aspx/TestArray", 
     data: jsonData, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert('win'); 
     }, 
     error: function (a, b, ex) { 
      alert('fail'); 
     } 
    }); 
} 

這樣一起:

$(document).ready(function() { 
    $("#btnSubmit").click(function (e) { 
     e.preventDefault(); 
     var names = new Array(); 
     names[0] = "Christy"; 
     names[1] = "Jeremy"; 
     var obj = { 
      names: names, 
      age: "21+", 
      comment: "friends" 
     }; 
     var jsonData = JSON.stringify(obj); 
     sendData(jsonData); 
    }); 

    function sendData(jsonData) { 
     $.ajax({ 
      type: "POST", 
      url: "Default.aspx/TestArray", 
      data: jsonData, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       alert(msg.d); 
      }, 
      error: function (a, b, ex) { 
       alert("oops: " + ex); 
      } 
     }); 
    } 
}); 

我不知道我是否在做這個權利。它甚至沒有進入webmethod,而是直接進入錯誤功能。但只是談話的緣故,這是我的代碼隱藏:

[WebMethod()] 
public static string TestArray(string guids) 
{ 
    Comment cmt = (Comment)JsonConvert.DeserializeObject(guids, typeof(Comment)); 
    return "Winner"; 
} 

課程班IM,並試圖反序列化到:

public class Comment 
{ 
    public List<string> names { get; set; } 
    public string age { get; set; } 
    public string comment { get; set; } 
} 
+0

請參閱[本答案](http:// stackoverflow。com/a/9084625/283366)獲取關於在原始郵件正文中發送JSON數據的信息 – Phil 2012-03-28 05:52:27

回答

2

根據您的Web方法的簽名:

public static string TestArray(string guids) 

,而您要發送其沒有按」整個複雜的JSON對象,你必須發送一個字符串參數t匹配。所以:

var jsonData = JSON.stringify({ guids: 'foo bar' }); 

現在,如果你想送一個複雜的結構用途:

public static string TestArray(Comment comment) 

然後:

var names = new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 
var jsonData = JSON.stringify({ comment: obj }); 

而且你的Web方法沒有做任何JSON序列內/ deserializations。這是框架爲您處理的基礎架構。因此,要回顧:

[WebMethod] 
public static string TestArray(Comment comment) 
{ 
    return "Winner"; 
} 

然後:

var names = new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 
var jsonData = JSON.stringify({ comment: obj }); 

$.ajax({ 
    type: "POST", 
    url: "Default.aspx/TestArray", 
    data: jsonData, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (msg) { 
     // Notice the .d property. That's ASP.NET PageMethods 
     // serialize the response. 
     alert(msg.d); 
    }, 
    error: function (a, b, ex) { 
     alert('fail'); 
    } 
}); 
爲了能夠

而且輕鬆地調試我會非常強烈建議您使用JavaScript調試工具在未來這樣的問題,如螢火這向您顯示您可能遇到的任何潛在的js錯誤,以及包括AJAX請求在內的所有網絡流量。

+0

有趣!我反序列化自己。 avernice。謝謝! – Sinaesthetic 2012-03-28 06:03:40

-1

你JSON數據對象不具有被串聯起來。 jQuery將自動爲它創建一個JSON對象:

var jsonData = JSON.stringify(obj); 
sendData(jsonData); 

能成爲:

sendData(obj); 

此外,在後面的代碼,你從JSON.Net庫使用JsonConvert,.NET也有一個(有點限制) JSON解析器調用JavaScriptSerializer。這樣,你可以使用類似:

public static string TestArray(string guids) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    // Deserialize 
    Comment cmt = serializer.Deserialize<Comment>(guids); 
} 
+0

如果這樣做,jQuery將發佈一組鍵值對 – Phil 2012-03-28 05:47:29

+0

仍然無效。 「內部服務器錯誤」。如果我從json對象中刪除年齡和評論字段,並將其作爲webmethod中的列表處理,它將起作用。但我需要陣列。 – Sinaesthetic 2012-03-28 05:49:53

相關問題