2012-04-14 67 views
0

timeline.js + MVC +阿賈克斯+ JSON如何字符串轉換成JSON對象

你好,

我有問題,而轉換字符串JSON對象

我要上顯示時間表我的網頁,我已經使用Timeline.js相同,我可以使用以下靜態數據運行時間線

靜態數據

// Create a JSON data table 
data = [ 
{ 
     'start': new Date(2010, 7, 23), 
    'content': 'Conversation' 
}, 
{ 
    'start': new Date(2010, 7, 23), 
    'content': 'New Conversation' 
}, 
{ 
    'start': new Date(2010, 7, 23), 
    'content': 'Very New Conversation' 
} 

現在,當我做

alert(data); 

它給了我

[object Object],[object Object],[object Object] 

,但現在我要顯示從一個數據庫中的數據,所以我呼籲控制器

以下功能

控制器上的GetTimeLine方法

public JsonResult GetTimeline() 
{ 
     JsonResult jr = new JsonResult(); 
     var objtimeline = objEntities.Timelines.Where(tl => tl.StudentID == Sessions.StudentID).ToList().AsQueryable(); 
     String newstr = "["; 
     foreach(var tml in objtimeline) 
     { 
      DateTime date1 = Convert.ToDateTime(tml.CalculatedDate); 
      newstr += "{'start': new Date("+date1.Year+","+date1.Month+","+date1.Day+","+date1.Hour+","+date1.Minute+","+date1.Second+"),'content':'"+tml.Description+"'},"; 
     } 
     newstr = newstr.TrimEnd(','); 
     newstr += "];"; 
     jr.Data = newstr; 
     jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
     return jr; 
} 

函數來調用控制器方法

jQuery.ajax({ 
    type: "POST", 
    url: "@Url.Content("~/Student/GetTimeline")", 
    success: function (result) { 
     data = result; 
    }, 
}); 
alert(data); 

它給了我下面的警告

[{'start': new Date(2012,2,11,0,0,0),'content':'Parents meeting'},{'start': new Date(2012,2,15,0,0,0),'content':'Exam Meeting'}]; 

所以這個問題是字符串JSON對象的轉換,

我如何轉換字符串從返回控制器到我查看的Json對象...

+0

我想你需要再看看JSON對象和它們的語法。如果它用Javascript中的'['和']'包裝,它就是一個數組,而不是一個對象(JSON或其他)。 – 2012-04-14 13:13:23

+0

@AnthonyGrist:擁有一個數組作爲頂級對象是有效的JSON。 (然而,引用的字符串不是,沒有那些單引號和那裏的'new Date(...)'。) – 2012-04-14 13:14:33

+0

@TJCrowder它會出現**我是**需要另一個看看語法,然後! – 2012-04-14 13:20:20

回答

4

你正在努力工作。讓框架爲你做。

​​

然後,使用getJSON(因爲你特別允許獲得),或在您的請求中指定dataType: 'json'

$.getJSON('@Url.Action("gettimeline","student")', function(data) { 
    alert(data); 
}); 
+0

gettimeline方法給出了以下錯誤 - {「LINQ to Entities不能識別方法'System.DateTime ToDateTime(System.Object)'方法,並且此方法不能被轉換爲存儲表達式。」} – 2012-04-14 13:34:01

+0

@ITppl我注意到可能發生和更新,但你一定沒有看到我的變化。 Convert調用沒有翻譯,因此您需要在轉換之前在內存中加載對象。但是,如果CalculatedDate已經是DateTime,則不需要執行此操作。請告訴我,您將它作爲實際的DateTime存儲在數據庫中,而不是字符串。如果是這樣,只需刪除ToList()和轉換。 – tvanfosson 2012-04-14 13:36:12

+0

它在控制器端工作正常,但它返回這個[0] = {start = {2/11/2012 12:00:00 AM},content =「考試會議」}但我想要start =(2012,11, 2,0,0,0),因爲它在timeline.js中使用,怎麼做 – 2012-04-14 13:43:08

1

你有服務器返回的是無效的JSON。或者給你的服務器端代碼,它可能是有效的JSON,它只是定義了一個字符串而不是一個對象圖。在JSON:

  • 所有對象鍵必須在引號,而不是單引號。
  • 所有的字符串必須在的報價,而不是單引號。
  • new Date(...)無效(JSON沒有任何日期的概念)。

我相信你想建立一個數組(不是字符串),並將其賦值給jr.Data,然後讓JsonResult object爲您處理序列化(但我沒有在ASP.net MVC做到了這一點) 。

一旦你有服務器返回有效的JSON,確保它返回正確的Content-Type標題(值爲application/json)。當你這樣做的時候,jQuery會看到它是JSON並且將它反序列化爲一個對象圖。如果您不能或不想讓您的服務器返回有效的JSON,請將dataType: 'json'添加到ajax調用中來強制它。

+0

是我想從控制器返回timeline.js可以使用的數組,什麼是其他方式? – 2012-04-14 13:23:42

+0

@ITppl:正如我所說:*「我相信你想要建立一個數組(而不是一個字符串)並將其分配給'jr.Data',然後讓'JsonResult'對象爲你處理序列化」* – 2012-04-14 13:26:36