1

次の C# コードを使用して、PageMethod を使用して 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@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"}
]

これは、正しくフォーマットされたデータを処理するテーブル塗りつぶしコードを示す plkr です

于 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、ユーザー名などを 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/

さらに調査した後:
この問題を掘り下げ続けるには、「ドキュメントが正しい場合」JsonWriter ドキュメントが JSON の問題の原因であると考えています。

私はあなたのサーバーコードが持つ必要があると信じています

    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 に答える