C# jQuery无法正确反序列化json对象

C# jQuery无法正确反序列化json对象,c#,jquery,asp.net,json,C#,Jquery,Asp.net,Json,我无法成功地反序列化从c#代码隐藏传递的JSON对象。我已经为此工作了3个小时,不明白原因 下面是我的json对象创建 struct specialitiy_struct { public int id; public string name; }; [WebMethod] public static string get_specialities(string ProfessionalID) { Database db = DatabaseFactory.Create

我无法成功地反序列化从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对象,请帮助我执行此操作?

尝试以下操作:

success: function (data) {
    $.each($.parseJSON(data.d), function (key, value) {
        $("#txt_speciality").tokenInput("add", {
            name: value.name,
            id: value.id
        });
    });
}
试试这个:

success: function (data) {
    $.each($.parseJSON(data.d), function (key, value) {
        $("#txt_speciality").tokenInput("add", {
            name: value.name,
            id: value.id
        });
    });
}

我认为你的问题在于:

$.each(data, function (dt) { // <----dt here
      var mydata = data.d; //<----data.d data here
d:“[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil Tip”}]”


似乎不是一个可循环使用的有效json对象。

我认为您的问题在于:

$.each(data, function (dt) { // <----dt here
      var mydata = data.d; //<----data.d data here
d:“[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil Tip”}]”

似乎不是可循环使用的有效json对象。

您的问题(部分)是因为
data.d
是一个对象数组,而不是单个对象,因此您无法访问它的
name
id
属性以获取有用信息(它没有任何属性)。我怀疑您实际上应该做的是迭代
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字符串属性,则应更改该属性,因为绝对不需要这样做。

您的问题(部分)是因为
data.d
是一个对象数组,而不是单个对象,因此,您无法访问它的
name
id
属性来获取有用的信息(它没有任何属性)。我怀疑您实际上应该做的是迭代
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字符串属性,则应更改该属性,因为绝对不需要这样做。

您可以尝试以下操作:

success: function (data, status) {
           var mydata = $.parseJSON(data);           
           $.each(mydata, function (index, element) {
              $("#txt_speciality").tokenInput("add", { name: element.name, id: element.id});
           });
         }
如果这样做有效,JSON内容类型可能设置不正确。

您可以尝试以下方法:

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


如果这样做有效,JSON内容类型可能设置不正确。

但是反序列化时会发生什么?是否有任何错误消息?序列化的json是什么样子的?(在fiddler中运行api请求,看看它返回什么)我在上面添加了json对象。对不起,我把它放在开头
d:“[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil-Tip”}]”
在我看来不是有效的json<代码>{d:[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil Tip”}]}更合适,但反序列化时会发生什么?是否有任何错误消息?序列化的json是什么样子的?(在fiddler中运行api请求,看看它返回什么)我在上面添加了json对象。对不起,我把它放在开头
d:“[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil-Tip”}]”
在我看来不是有效的json<代码>{d:[{“id”:67,“name”:“Kardiyoloji”},{“id”:1,“name”:“Acil Tip”}]}会更合适,因为他将json编码的字符串包装在需要解析的
中。否则,这些只是字符串。这是因为他得到了用
包装的json编码字符串,需要对其进行解析。否则,这些只是字符串。好的,你能展示一个json数据样本吗??可以只在
success
方法中放置一个
console.log(data)
。并将结果粘贴到此处。…。@Will.i.am使用
console.log(data)
不会有多大帮助,因为对象/数组的控制台显示通常与有效的JSON结构不匹配。理想情况下,在解析字符串之前,我们需要的是字符串,而不是结果对象。{“d”:“[{\'id\':67,\'name\':\'Kardiyoroji\',{\'id\':1,\'name\':\'Acil Tip\'”]”}这是来自服务器的响应。我从chrome toolOk得到了这个响应,你能展示一个json数据示例吗??可以只在
success
方法中放置一个
console.log(data)
。并将结果粘贴到此处。…。@Will.i.am使用
console.log(data)
不会有多大帮助,因为对象/数组的控制台显示通常与有效的JSON结构不匹配。理想情况下,在解析字符串之前,我们需要的是字符串,而不是结果对象。{“d”:“[{\'id\':67,\'name\':\'Kardiyoroji\',{\'id\':1,\'name\':\'Acil Tip\'”]”}这是来自服务器的响应。我从chrome工具上得到了这样的回应,你说的有道理,但我不知道怎么做。你能给我一个完整的密码吗?@Borsel我需要确切地知道服务器返回了什么;如果您使用的是Firebug,那么您可以在控制台中看到AJAX请求的响应,将其复制并编辑到问题中。它返回以下{“d”:“[{“id\”:67,\“name\”:\“Kardiyoloji\”},{“id\”:1,\“name\”:“Acil Tip\”}”}@Borsel两个选项。1.将
d
从一个JSON字符串更改为一个数组(基本上去掉它周围的双引号)——不过,您可能需要更改服务器端代码才能做到这一点,对此我无能为力(我不是C#/ASP.NET程序员)。2.解析JSON字符串
d
以获得实际数组,然后迭代该数组;我已经编辑了我的答案。选项1是你真正应该做的,但选项2更容易快速实施。你说的有道理,但我不知道怎么做。你能给我一个完整的密码吗?@Borsel我需要确切地知道服务器返回了什么;如果您使用的是Firebug,那么您可以在控制台中看到AJAX请求的响应,将其复制并编辑到问题中。它返回以下{“d”:“[{“id\”:67,\“name\”:\“Kardiyoloji\”},{“id\”:1,\“name\”:“Acil Tip\”}”}@Borsel两个选项。1.将
d
从一个JSON字符串更改为一个数组(基本上去掉它周围的双引号)——不过,您可能需要更改服务器端代码才能做到这一点,对此我无能为力(我不是一个C#/ASP.NET程序)