【问题标题】:Why can't I use my JSON data?为什么我不能使用我的 JSON 数据?
【发布时间】:2015-04-12 08:54:40
【问题描述】:

我正在尝试从 AJAX 函数中读取一些 JSON 数据。这是我正在使用的 AJAX:

             $.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、text[0].xCoord 等)。 (2) 上面的第二种格式在尝试提取数据以在画布上绘画时是否会出现问题(我想知道的是反斜杠)?

谢谢。

【问题讨论】:

  • 你为什么要返回字符串?如果您返回行会更容易。
  • 在您的文档准备好之前,您的 Ajax 调用可能正在返回。确保您在 $(document).ready(/*here8/); 中调用该 ajax 函数,以确保您的 #jsonData 在您尝试显示它时可用。
  • 你能给我举个例子@lujcon吗?

标签: javascript c# asp.net sql-server json


【解决方案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

【讨论】:

    【解决方案2】:

    在您的成功函数中,您不需要字符串化或 json.Parse 'data' 变量,而是 data.d 变量。 'd' 是您需要解析的 json 返回的成员。

    所以,将var text = JSON.stringify(data); 更改为var text = JSON.stringify(data.d);,你应该是金子了。

    【讨论】:

    • 这与@lujcon 的 C# 答案一起解决了我的问题。我创建了一个社区 wiki 答案,结合了他和你的答案。谢谢你。赞成。
    【解决方案3】:
    [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);
                }
            });
    

    【讨论】:

    • 这实际上已将 JSON 正确格式化回我的 Javascript,但我仍然无法对数据做任何事情——我无法提取类似 alert(text.d[0].xCoord );
    • ??你要返回什么数据??
    • 我不知道是谁投了反对票,但这不值得。它实际上有助于使 JSON 返回,因此我可以正确地将其转换为 Javascript 变量。我快到了。
    • 感谢这个答案和@JustinRusso,问题得以解决。我制作了一个社区 Wiki 答案并为你的答案投票。
    • 我刚刚修改了我的答案 - 但看起来我对 javascript 部分有误... MS 序列化一直让我感到惊讶 ;)
    【解决方案4】:

    正如@lujcon 所说,我必须在我的 C# 代码中返回行:

    [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); 更改为 var text = JSON.stringify(data.d);,正如@JustinRusso 所说。现在工作。谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2020-08-31
      • 2019-02-11
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多