2015-02-11 4 views
0

Я пытаюсь прочитать некоторые данные JSON из функции AJAX. Вот AJAX я использую:Почему я не могу использовать данные JSON?

   $.ajax({ 
       type: 'POST', 
       cache: false, 
       url: 'Default.aspx/GetCoords', 
       data: "{}", 
       contentType: 'application/json; charset=utf-8', 
       dataType: 'json', 
       success: function (data) { 
        var text = JSON.stringify(data); 
        $("#jsonData").html(text); 
        alert(text); 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert(xhr.status); 
        alert(thrownError); 
       } 
      }); 

Я также использовать JSON.parse вместо stringify и объекты возвращают неопределенное значение или нет вообще. Это происходит из C# функция, которая выглядит следующим образом:

[WebMethod] 
    [ScriptMethod] 
    public static string GetCoords() 
    { 
     DataTable dt = new DataTable(); 
     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM DRAW ORDER BY DrawID DESC;", con)) 
      { 
       con.Open(); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(dt); 
       JavaScriptSerializer serializer = new JavaScriptSerializer(); 
       List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
       Dictionary<string, object> row; 
       foreach (DataRow dr in dt.Rows) 
       { 
        row = new Dictionary<string, object>(); 
        foreach (DataColumn col in dt.Columns) 
        { 
         row.Add(col.ColumnName, dr[col]); 
        } 
        rows.Add(row); 
       } 
       System.Diagnostics.Debug.WriteLine(serializer.Serialize(rows)); 
       return serializer.Serialize(rows);     
      } 
     } 
    } 

Он возвращает данные в формате JSON: Вот как это выглядит на консоли отладчика, и когда я вызываю функцию в пункте тег:

[{"DrawID":925,"xCoord":466,"yCoord":201},{"DrawID":924,"xCoord":385,"yCoord":318},{"DrawID":923,"xCoord":768,"yCoord":159},{"DrawID":922,"xCoord":543,"yCoord":214},{"DrawID":921,"xCoord":329,"yCoord":172}] 

Однако, когда я посылаю его к пункту тега в JQuery или вызвать его в HTML пункте, вот как это выглядит:

{"d":"[{\"DrawID\":925,\"xCoord\":466,\"yCoord\":201},{\"DrawID\":924,\"xCoord\":385,\"yCoord\":318},{\"DrawID\":923,\"xCoord\":768,\"yCoord\":159},{\"DrawID\":922,\"xCoord\":543,\"yCoord\":214},{\"DrawID\":921,\"xCoord\":329,\"yCoord\":172}]"} 

у меня есть два вопроса: (1) Почему я не могу использовать эти данные для вставки xCoords и yCoords в холст? Я пробовал много форматов: (data.d [0] .xCoord, d [0] .xCoord, text.d [0] .xCoord, текст [0] .xCoord и т. Д.). (2) Является ли второй формат выше проблемой, пытаясь извлечь эти данные для рисования на холсте (это то, что мне интересно)?

Спасибо.

+1

Почему вы возвращаете строку? Может быть проще, если вы вернете строки. – lujcon

+0

Возможно, ваш вызов Ajax возвращается до того, как ваш документ будет готов. убедитесь, что вы вызываете эту функцию ajax внутри '' $ (document) .ready (/ * here8 /); '', чтобы ваш '' # jsonData'' был доступен, когда вы пытаетесь его отобразить. –

+0

Можете ли вы привести мне пример @lujcon? – btalbot

ответ

2

В функции успеха, вы не stringify или JSON.parse переменная «данные», а переменная data.d. 'd' является членом json return, который вам нужно проанализировать.

Итак, измените, var text = JSON.stringify(data); на var text = JSON.stringify(data.d);, и вы должны быть золотыми.

+1

Это, вместе с ответом C# от ответа @lujcon, решило мою проблему. Я создал ответ сообщества wiki, объединяя его и ваши ответы. Спасибо. Upvoted. – btalbot

1

Вы должны использовать parseJSON как таковую:

myThing = {"d":"[{\"DrawID\":925,\"xCoord\":466,\"yCoord\":201},{\"DrawID\":924,\"xCoord\":385,\"yCoord\":318},{\"DrawID\":923,\"xCoord\":768,\"yCoord\":159},{\"DrawID\":922,\"xCoord\":543,\"yCoord\":214},{\"DrawID\":921,\"xCoord\":329,\"yCoord\":172}]"}; 

myJSON = $.parseJSON(myThing.d); 
alert (myJSON[0].DrawID); //etc 
0
[WebMethod] 
[ScriptMethod] 
public static Dictionary<string, object>[] GetCoords() 
{ 
    DataTable dt = new DataTable(); 
    using (SqlConnection con = new SqlConnection(connectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM DRAW ORDER BY DrawID DESC;", con)) 
     { 
      con.Open(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(dt); 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
      Dictionary<string, object> row; 
      foreach (DataRow dr in dt.Rows) 
      { 
       row = new Dictionary<string, object>(); 
       foreach (DataColumn col in dt.Columns) 
       { 
        row.Add(col.ColumnName, dr[col]); 
       } 
       rows.Add(row); 
      } 
      System.Diagnostics.Debug.WriteLine(serializer.Serialize(rows)); 
      return rows.ToArray();     
     } 
    } 
} 

Java скрипт:

  $.ajax({ 
      type: 'POST', 
      cache: false, 
      url: 'Default.aspx/GetCoords', 
      data: "{}", 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function (data) { 

       $.each(data, function(index, value) { 
        var x = value.xCoord; 
        /// do something with it ;) 
       }); 
       var text = JSON.stringify(data); 
       $("#jsonData").html(text); 
       alert(text); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert(xhr.status); 
       alert(thrownError); 
      } 
     }); 
+0

Это фактически отформатировало JSON обратно на мой Javascript, но я все еще ничего не могу сделать с данными - я не могу извлечь что-то вроде alert (text.d [0] .xCoord); – btalbot

+0

?? Какие данные вы возвращаете? – lujcon

+0

Я не знаю, кто это сделал, но это не заслуживает. Фактически это помогло вернуть JSON, чтобы я мог правильно превратить его в Javascript-переменную. Я почти там. – btalbot

0

мне пришлось возвращать строки в моем C# код, как @lujcon сказал:

[WebMethod] 
[ScriptMethod] 
public static List<Dictionary<string, object>> GetCoords() 
{ 
    DataTable dt = new DataTable(); 
    using (SqlConnection con = new SqlConnection(connectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM DRAW ORDER BY DrawID DESC;", con)) 
     { 
      con.Open(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(dt); 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
      Dictionary<string, object> row; 
      foreach (DataRow dr in dt.Rows) 
      { 
       row = new Dictionary<string, object>(); 
       foreach (DataColumn col in dt.Columns) 
       { 
        row.Add(col.ColumnName, dr[col]); 
       } 
       rows.Add(row); 
      } 
      System.Diagnostics.Debug.WriteLine(serializer.Serialize(rows)); 
      return rows;     
     } 
    } 
} 

Тогда я должен был изменить свой var text = JSON.stringify(data); в вар текст = JSON.stringify(data.d); как сказал @JustinRusso. Работает сейчас. Всем спасибо.