0

C# コード ビハインドから渡された JSON オブジェクトを逆シリアル化できません。私はこの 3 時間に取り組んできましたが、その理由を理解できませんでした。

これが私のjsonオブジェクトの作成です

struct specialitiy_struct {
    public int id;
    public string name;
};

[WebMethod]
public static string get_specialities(string ProfessionalID)
{
    Database db = DatabaseFactory.CreateDatabase("Connection");
    DbCommand dbCommand;
    dbCommand = db.GetStoredProcCommand("Select_Profes_Speciality");
    db.AddInParameter(dbCommand, "prof_id", DbType.Int16, Convert.ToInt16(ProfessionalID));
    IDataReader dr = db.ExecuteReader(dbCommand);

    List<specialitiy_struct> my_list = new List<specialitiy_struct>();
    specialitiy_struct my_speciality;

    while (dr.Read()) {
        my_speciality = new specialitiy_struct();
        my_speciality.id = Convert.ToInt16(dr["SpecialtyID"].ToString().Trim());
        my_speciality.name = dr["SpecialtyName"].ToString().Trim();
        my_list.Add(my_speciality);
    }
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Serialize(my_list);
}

そして、これはjsonオブジェクトを逆シリアル化するjqueryコードです

$.ajax({
     type: "POST",
     url: "NotificationSettings.aspx/get_specialities",
     data: "{'ProfessionalID':'" + <%= Session["ProflId"].ToString().Trim() %> + "'}",
     contentType: "application/json; charset=utf-8",
     dataType: "json",
     success: function (data, status) {
       $.each(data, function (dt) {
          var mydata = data.d;
          var obj = $.parseJSON(mydata);
          $("#txt_speciality").tokenInput("add", { name: obj.name, id: obj.id});
       });
     }
});

返されるjsonオブジェクトはこれ

 d: "[{"id":67,"name":"Kardiyoloji"},{"id":1,"name":"Acil Tip"}]"

json オブジェクトを適切に逆シリアル化できません。

4

4 に答える 4

2

あなたの問題は(部分的に)data.dオブジェクトの配列であり、単一のオブジェクトではないため、そのプロパティにアクセスして有用な情報を取得できないためですnameid何もありません)。あなたが実際にすべきことは、次のようdata.dに ではなくを繰り返すことだと思います。data

var d = $.parseJSON(data.d);
$.each(d, function(index, dt) {
    $("#txt_speciality").tokenInput("add", { name: dt.name, id: dt.id});
});

サーバーから有効な JSON を返す場合は、自分で解析する必要はありません。JSON 文字列プロパティを持つ JSON オブジェクトを返す場合は、そのようにする必要がまったくないため、それを変更する必要があります。

于 2013-04-05T08:15:04.453 に答える
1

これを試して:

success: function (data) {
    $.each($.parseJSON(data.d), function (key, value) {
        $("#txt_speciality").tokenInput("add", {
            name: value.name,
            id: value.id
        });
    });
}
于 2013-04-05T08:05:58.073 に答える
0

あなたの問題はここにあると思います:

$.each(data, function (dt) { // <----dt here
      var mydata = data.d; //<----data.d data here

これに変更します。

success: function (data, status) {
   $.each(data, function (i, dt) {
      var mydata = dt.d;
      var obj = $.parseJSON(mydata);
      $("#txt_speciality").tokenInput("add", { name: obj.name, id: obj.id});
   });
 }

d: "[{"id":67,"name":"Kardiyoloji"},{"id":1,"name":"Acil Tip"}]"

ループする有効な json オブジェクトではないようです。

于 2013-04-05T08:11:18.313 に答える
0

これを試すことができます:

success: function (data, status) {
           var mydata = $.parseJSON(data);           
           $.each(mydata, function (index, element) {
              $("#txt_speciality").tokenInput("add", { name: element.name, id: element.id});
           });
         }

これが機能する場合、JSON コンテンツ タイプが正しく設定されていない可能性があります。

于 2013-04-05T08:16:42.873 に答える