1

我正在使用 PageMethod 使用以下 C# 代码以 Json 格式检索表数据

[WebMethod]
public static string GetJson2()
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    JsonWriter jsonWriter = new JsonTextWriter(sw);

    try
    {
        string connstr = "server=localhost;user=root;database=cm_users;port=3306;password=root";
        MySqlConnection conn = new MySqlConnection(connstr);
        conn.Open();
        string sql = "select * from users";
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        MySqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {

            int fieldcount = reader.FieldCount; // count how many columns are in the row
            object[] values = new object[fieldcount]; // storage for column values
            reader.GetValues(values); // extract the values in each column

            jsonWriter.WriteStartObject();
            for (int index = 0; index < fieldcount; index++)
            { // iterate through all columns

                jsonWriter.WritePropertyName(reader.GetName(index)); // column name
                jsonWriter.WriteValue(values[index]); // value in column

            }
            jsonWriter.WriteEndObject();
        }
        reader.Close();

    }
    catch (MySqlException mySqlException)
    { // exception
        return mySqlException + "error";
    }

    // END of method
    // the above method returns sb and another uses it to return as HTTP Response...
    string jsonString = sb.ToString();
    return jsonString; ;
}

现在我正在使用 Java Scipt 将方法的输出捕获到 html 页面中

使用 Ajax JavaScript 我正在使用 Json 格式的返回字符串。

function getUsers() {
    $.ajax({
        type: "POST",
        url: "http://{address}:8078/Default.aspx/GetJson2",
        data: "{}",
        contentType: "application/json",
        dataType: "json",
        success:  function (msg) {
            $("#Result").text(msg.d);
            var myTable1 = ''; 
            myTable1 += '<table id="myTable1" cellspacing=0 cellpadding=2 border=1>';
            myTable1 += "<tr><td><b>ID</b></td><td><b>UserName</b></td><td><b>Password</b></td><td><b>Email</b></td></tr>";


            $.each(msg, function(i,v){
                alert(i + v);

                myTable1 += "<tr><td>" + v.id + "</td><td>" + v.username + "</td><td>" + v.password + "</td><td>" + v.Email + "</td></tr>"; 
            });

            $("#user_tb1").html(myTable1) ;
        },
        error:    function () {
            alert("error");
        } 

    });
};

我将 Json 字符串作为

{"id":1,"username":"karthik","password":"karthik","Email":"karthikdheeraj@gmail.com"}{"id":2,"username":"Lohith", "密码":"Lohith","电子邮件":"lohith@cnonymn.com"}

和 HTML 作为

一个表格结构,其中每个单元格都填充有“未定义”

上面代码中的问题可能是什么。

4

3 回答 3

2

看起来从服务器检索到的 json 不正确,它不是对象数组。

正确的格式应该是:

[
{"id":1,"username":"karthik","password":"karthik","Email":"karthikdheeraj@gmail.com"},
{"id":2,"username":"Lohith","password":"Lohith","Email":"lohith@cnonymn.com"}
]

这是一个plnkr,显示您的表格填充代码使用正确格式的数据

于 2013-05-22T13:49:47.813 回答
1

JsonTextWriter 不打算以您使用它的方式使用。

您应该利用序列化库,这样您就不必编写代码来序列化 JSON。

这是一个使用 JSON.NET 的解决方案。

在您的解决方案中包含位于http://json.codeplex.com/的包。

将此 using 语句添加到您的文件中:

using Newtonsoft.Json;

添加一个类以将您的记录映射到。

public class User{
   ... properties here

}



[WebMethod]
public static string GetJson2()
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    JsonWriter jsonWriter = new JsonTextWriter(sw);
    var users = new List<User>();
    try
    {
        string connstr = "server=localhost;user=root;database=cm_users;port=3306;password=root";
        MySqlConnection conn = new MySqlConnection(connstr);
        conn.Open();
        string sql = "select * from users";
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        MySqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {

            int fieldcount = reader.FieldCount; // count how many columns are in the row
            object[] values = new object[fieldcount]; // storage for column values
            reader.GetValues(values); // extract the values in each column

            users.add(new User { id = reader["id"], username = reader["username"] ..});
        }
        reader.Close();

    }
    catch (MySqlException mySqlException)
    { // exception
        return mySqlException + "error";
    }

    return JsonConvert.SerializeObject(users);
}

您还应该考虑将您的 id、username 等命名为 Id、Username 等,以便遵循正确的命名约定。

于 2013-05-22T14:13:55.770 回答
1

您要返回的 JSON 有问题。正确的格式需要是:

var json = [{
    "id": 1,
    "username": "karthik",
    "password": "karthik",
    "Email": "karthikdheeraj@gmail.com"
}, {
    "id": 2,
    "username": "Lohith",
    "password": "Lohith",
    "Email": "lohith@cnonymn.com"
}];

下面是我创建的一个小提琴,显示循环现在正确地提醒用户名。 http://jsfiddle.net/77YBq/

经过更多调查:
要继续深入研究此问题,我相信您的 JSON 问题的根源“如果文档正确” JsonWriter Documentation

我相信你的服务器代码需要有

    jsonWriter.WriteStartArray(); // Starts Json Array notation;

    // This is your existing code
    //================================================================================
    while (reader.Read())
    {

        int fieldcount = reader.FieldCount; // count how many columns are in the row
        object[] values = new object[fieldcount]; // storage for column values
        reader.GetValues(values); // extract the values in each column

        jsonWriter.WriteStartObject();
        for (int index = 0; index < fieldcount; index++)
        { // iterate through all columns

            jsonWriter.WritePropertyName(reader.GetName(index)); // column name
            jsonWriter.WriteValue(values[index]); // value in column

        }
        jsonWriter.WriteEndObject();
    }
    reader.Close();
    //================================================================================
    // End of your existing code

    jsonWriter.WriteEndArray();  // Ends Json Array notation;
于 2013-05-22T13:50:19.170 回答