【问题标题】:SyntaxError: JSON.parse: unexpected keyword at line 1 column 1 of the JSON dataSyntaxError:JSON.parse:JSON 数据第 1 行第 1 列的意外关键字
【发布时间】:2016-01-18 19:24:54
【问题描述】:

尝试在列表框中标记复选框时出现此错误

此方法的目的是加载控制器用户列表。

它选择用复选框返回的用户。

错误行:var users = $.parseJSON(loadAction);

第一个函数

function loadAction() {
        $.ajax({
            url: "@Url.Action("LoadUsersCheckBox", "User")",
            type: "GET",
            data: {
                idUser: idUser
            }
        });
    };

function loadUsers() {
    loadAction();

    var users = $.parseJSON(loadAction);

    $("#UsuariosInformados option").each(function() {
        var opt = $(this),
            value = opt.attr("value");

        opt.removeAttr("selected");

        if (users.indexOf(value) > -1) {
            opt.attr("selected", "selected");
        }
    });
}

控制器 LoadUsersCheckBox

public JsonResult LoadUsersCheckBox(int? idUser)
{
    var users =  Service.GetSystemUsers(idUser);
    var model = users.Select(x => new
                {
                    Value = x,
                    Description = x
                });

    return this.Json(model, JsonRequestBehavior.AllowGet);
}

我的问题是什么?

【问题讨论】:

    标签: javascript c# json asp.net-mvc-4


    【解决方案1】:

    这里:

    var users = $.parseJSON(loadAction);
    

    loadAction 是一个函数。您无法将其解析为 json。任何 json 解析都应该在 $.ajaxsuccess 回调中。目前,您正在执行 HTTP GET 请求、丢弃结果并解析 javascript 函数对象(尽管不是按此顺序)。

    【讨论】:

      【解决方案2】:

      正如@Mark Gravel 在他的回答中提到的,您不应该将函数传递给 parseJSON 方法。 parseJSON 方法接受一个 json 字符串并将其转换为相应的 js 对象,这样您就可以使用类似字典的语法来访问生成的 js 对象的属性。(ex :someObj.SomeProperty

      您应该做的是,在 ajax 调用的成功事件中使用从服务器收到的数组。

      function loadUsers() {
          var idUser = 5; // hard coded for demo . Use a real value
          $.ajax({
              url: "@Url.Action("ReportScore", "Home")",
              type: "GET",
              data: { idUser: idUser },
              success: function (data) {
      
                  $("#UsuariosInformados option").each(function () {
                      var opt = $(this);
                      value = opt.attr("value");
      
                      opt.removeAttr("selected");
                       // Read further about this if condition check .....
                      if (data.indexOf(value) > -1) {
                          opt.attr("selected", "selected");
                      }
                  });
              }
      
          });
      }
      

      我真的不明白您要对收到的结果数组做什么。看起来您正在尝试将选择元素中的一个选项设置为所选项目。通常,您可以使用val() 方法来执行此操作。

      $("#UsuariosInformados").val(25);
      

      假设25 是选择元素中可用的选项之一(您希望被选中)的值。

      此外,从您的操作方法中,您将返回一个项目数组,每个项目都有一个 ValueDescription 属性(两者具有相同的值)并且您正在比较(indexOf 调用)它针对单个字符串值(循环中每个选项项的值)。您将永远不会得到真正的比较结果。你可能应该修复它:)

      【讨论】:

        【解决方案3】:

        我遇到了这个错误,发现它比字符串问题更难克服!

        这里是对同一案例中其他人的简短解释。

        在将对象实例化时出现错误,使用 new 关键字 到 JSON 字符串中。

        触发此特定错误的示例代码:

        var nobj = function(){this.status='ok'};
        var strjson2 = '{"display": "case 4","status":new nobj()}';
        var obj2 = JSON.parse(strjson2);
        

        这里是 JSfiddle,它演示了解决此错误的不同案例场景:https://jsfiddle.net/dv59b1no/1/

        可能有一种方法可以修复此特定错误,但我不知道。如果您替换对象创建,JSON.parse 将正常工作。

        我希望这对某人有用!

        【讨论】:

          猜你喜欢
          • 2021-04-02
          • 1970-01-01
          • 2014-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          • 2023-03-11
          • 1970-01-01
          相关资源
          最近更新 更多