【问题标题】:Webservice returns correct data but is parsed as undefinedWebservice 返回正确的数据,但被解析为未定义
【发布时间】:2016-01-14 10:04:35
【问题描述】:

我有这段代码,我用它来填写我网站上的下拉框。它从数据库中提取一些部门,然后应该将部门的 ID 作为选项值,然后将部门名称作为选项“名称”(它显示的名称)

/**
 * This function is Run when creating the dropdown to choose a department
 * when creating a new activity.
 */
function CreateNewActivityDepartmentDropdown() {
    $.getJSON("http://localhost/GetDepartmentsForDropdown", function (data) {
        var object = $.parseJSON(data);
        var dropdown = document.getElementById("new-activity-modal-department-dropdown");
        for (var department in object) {
            if (object.hasOwnProperty(department)) {
                var array = department.split(',');
                var option = document.createElement("option");
                option.id = array[0];
                option.innerHTML = array[1];
                dropdown.add(option);
            }
        }
    });
}

对象中确实包含正确的数据。我用谷歌浏览器调试器检查了它。数据由id,department 字符串组成,在我的for循环中,我尝试拆分我得到的字符串,但首先每个选项的值似乎只是一个增量值(0-n)而不是我拥有的id(1 -12) 并且选项文本是“未定义”。

果然,当我调试时,我发现 ID 和 Text 似乎不存在。我在这里想念什么?在 JavaScript 开发中还是相当新的 :)

编辑

添加了console.log(data, object)的输出

["1,Commercial","2,Economy","3,Technical Dept.","4,IT","5,Flight Op","6,Legal","7,Ground Op","8,BDO","9,Administration","10,Training","11,Passenger Service","12,Cabin"] Array[12]

编辑 2

数据对象是从网络服务接收的。 Webservice 是用 C# 编写的,我用来获取它的代码如下:

public static List<String> GetDepartmentDropdownList()
{
    List<String> departments = new List<String>();
    using (SqlConnection conn = GetSqlConnection())
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "SELECT * FROM dbo.Department WHERE is_used != 0";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;

            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    Int32 id = reader.GetInt32(0);
                    String department = id + "," + reader.GetString(1);
                    departments.Add(department);
                }
            }

        }
    }

    return departments;
}

这就是网站所说的:

public String GetDepartmentsForDropdown()
{
    List<String> departments = Facade.GetDepartmentDropdownList();

    return JsonConvert.SerializeObject(departments);
}

【问题讨论】:

  • console.log(data, object),告诉我们你应该使用什么数据。
  • @deceze 给你,添加到主帖。 :)
  • @SimonH — 否。属性名称被插入到上一行的department 变量中。
  • 你为什么首先用逗号连接而不是使用像样的数组/对象结构?!
  • @deceze 没有理由不高兴。我来这里寻求帮助,不要被告知我错了多少,也没有得到帮助。抱歉,如果这看起来很激进。

标签: javascript c# web-services


【解决方案1】:

getJSON 将 HTTP 响应正文解析为 JSON,然后用它填充 data

var object = $.parseJSON(data); 会将数组转换为字符串,然后尝试将其解析为 JSON(这将失败,因为它不是 JSON)。不要那样做。

【讨论】:

  • 嗯。对象本身通过使用 Newton Softs 库的 Web 服务序列化为 Json。在我收到之前。
  • @Vipar — 你是说 HTTP 响应由 JSON 字符串的 JSON 文本表示组成,而 JSON 字符串本身包含 JSON 数组的 JSON 文本表示?
  • 我可能应该详细说明一下。我在问题中添加了更多代码。
  • @Vipar — 我看不到任何表明服务器对数据进行双重编码的东西……所以我的回答成立。停止双重解码。
  • 我尝试只使用“数据”对象而不是像您(似乎?)建议的那样使用 parseJSON,但现在我仍然有“未定义”并且我有大约 3 倍的“未定义”选项与以前相比可供选择。
【解决方案2】:

对于那些对此感兴趣的人,我最终得到了解决方案:

/**
 * This function is Run when creating the dropdown to choose a department
 * when creating a new activity.
 */
function CreateNewActivityDepartmentDropdown() {
    $.getJSON("http://localhost/GetDepartmentsForDropdown", function (data) {
        var object = $.parseJSON(data);
        var dropdown = document.getElementById("new-activity-modal-department-dropdown");
        for (var i = 0; i < object.length; i++) {
            var array = object[i].split(',');
            var option = document.createElement("option");
            option.value = array[0];
            option.innerHTML = array[1];
            dropdown.add(option);
        }
    });
}

无需编辑 C# 代码。我不知道昆汀给我的解决方案,但似乎不执行此步骤:

var object = $.parseJSON(data);

我没有办法让它工作。我很乐意给出答案,但可以解释这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2021-12-14
    • 2012-04-12
    相关资源
    最近更新 更多