【问题标题】:unexpected token u in json at position 0 when parsing data解析数据时 json 中位置 0 的意外标记 u
【发布时间】:2018-08-01 05:00:19
【问题描述】:

很明显,我是遇到此问题的众多人中的一员,过去一个小时左右我一直在谷歌搜索,但似乎无法解决我的问题。

我正在尝试使用 AJAX 从我的控制器中获取数据以放入 jQuery FullCalendar, 现在我对我的控制器相当有信心,我仍然收到错误消息:

json 中位置 0 处的意外标记 U

所以肯定有问题。

这是我用来从控制器中的数据库中获取数据的脚本:

[HttpPost, ActionName("List")]
    [WebMethod(EnableSession = true)]
    public ActionResult List()
    {
        temphrmEntities db = new temphrmEntities();
        List<medewerker_melding> eventList = db.medewerker_melding.ToList();

        // Select events and return datetime as sortable XML Schema style.
        var events = from ev in eventList
                     select new
                     {
                         id = ev.ID,
                         title = ev.medewerker.voorvoegsel + ". " + ev.medewerker.achternaam,
                         desc = ev.Omschrijving,
                         start = ev.datum_van.ToString(),
                         end = ev.datum_tot.ToString(),
                         user = ev.medewerkerID,
                         melding = ev.meldingID
                     };

        // Serialize to JSON string.
        JavaScriptSerializer jss = new JavaScriptSerializer();
        String json = jss.Serialize(events);
        Debug.WriteLine("Json:"+json);
        return Json(json, JsonRequestBehavior.AllowGet);

    }

这是它返回的 Json 格式:

[  
  {  
  "id":1,
  "title":"K. Keesen",
  "desc":"zelf ziek gemeld",
  "start":"2-2-2018 13:00:00",
  "end":"5-2-2018 13:00:00",
  "user":15,
  "melding":1
  },
  {  
  "id":3,
  "title":"K. Keesen",
  "desc":null,
  "start":"2-2-2018 13:00:00",
  "end":"5-2-2019 13:00:00",
  "user":15,
  "melding":1
  },
  {  
  "id":5,
  "title":"K. Keesen",
  "desc":null,
  "start":"14-2-2018 08:30:00",
  "end":"",
  "user":15,
  "melding":1
  },
  {  
  "id":6,
  "title":"K. Keesen",
  "desc":"srgsrgrgdrgdrgd",
  "start":"7-2-2018 08:30:00",
  "end":"",
  "user":38,
  "melding":13
  },
  {  
  "id":7,
  "title":"T. test",
  "desc":null,
  "start":"14-2-2018 08:30:00",
  "end":"21-2-2018 17:00:00",
  "user":63,
  "melding":10
  },
  {  
  "id":8,
  "title":"K. Keesen",
  "desc":null,
  "start":"16-2-2018 08:30:00",
  "end":"23-2-2018 17:00:00",
  "user":28,
  "melding":14
  },
  {  
  "id":9,
  "title":"K. Keesen",
  "desc":null,
  "start":"14-2-2018 08:30:00",
  "end":"",
  "user":33,
  "melding":12
  },
  {  
  "id":10,
  "title":"K. Keesen",
  "desc":"fvghbj",
  "start":"22-2-2018 08:30:00",
  "end":"",
  "user":15,
  "melding":11
  },
  {  
  "id":11,
  "title":"K. Keesen",
  "desc":null,
  "start":"15-2-2018 08:30:00",
  "end":"22-2-2018 17:00:00",
  "user":15,
  "melding":1
  },
  {  
  "id":12,
  "title":"K. Keesen",
  "desc":null,
  "start":"23-2-2018 08:30:00",
  "end":"",
  "user":15,
  "melding":1
  },
  {  
  "id":13,
  "title":"K. Keesen",
  "desc":"Test take #25",
  "start":"7-2-2018 08:30:00",
  "end":"23-2-2018 17:00:00",
  "user":15,
  "melding":1
  },
  {  
  "id":14,
  "title":"K. Keesen",
  "desc":null,
  "start":"8-2-2018 08:30:00",
  "end":"",
  "user":15,
  "melding":1
  }
]

我使用Json Formatter & Validation检查它是否有效

最后是我的ajax函数:(我不太擅长ajax所以复制粘贴它)

function GenerateCalendar() {
            $("#calendar").fullCalendar({
                theme: true,
                header: {
                    left: "prev,next today",
                    center: "title",
                    right: "month,agendaWeek,agendaDay"
                },

                defaultView: 'month',
                selectable: true,
                selectHelper: true,
                editable: true,
                eventLimit: true,
                events: function (start, end, callback) {
                    $.ajax({
                        type: "POST",    //WebMethods will not allow GET
                        url: '@Url.Action("List/medewerker_melding")',   //url of a webmethod - example below
                        //data: "",  //this is what I use to pass who's calendar it is
                        //completely take out 'data:' line if you don't want to pass to webmethod - Important to also change webmethod to not accept any parameters
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (doc) {
                            var events = [];   //javascript event object created here
                            var obj = $.parseJSON(doc.d);  //.net returns json wrapped in "d"
                            $(obj.event).each(function () { //yours is obj.calevent
                                events.push({
                                    title: $(this).attr('title'),  //your calevent object has identical parameters 'title', 'start', ect, so this will work
                                    start: $(this).attr('start'), // will be parsed into DateTime object
                                    end: $(this).attr('end')
                                });
                            });
                            callback(events);
                        }
                    });
                },

                select: function (start, end) {
                    var start = moment(start).format();
                    var end = moment(end).format();
                    $('#startDate').val(start);
                    $('#endDate').val(end);
                    $('#eventModal').modal();
                    if ($('#eventModal')) {
                        $(".meldingForm").submit(function () {
                            //insertEvents();
                        });

                        $('#calendar').fullCalendar('renderEvent', events, true);
                    }
                    $('#calendar').fullCalendar('unselect');
                },
            });
        }

谢谢!

【问题讨论】:

  • 该错误意味着响应不是 JSON。在控制台的网络选项卡中找到请求并准确检查响应是什么
  • 每个网络的状态都是 200:正常,除了一个状态为 101 交换协议并且永远挂起...

标签: jquery json ajax razor asp.net-mvc-5


【解决方案1】:

您说您复制了 AJAX,请仔细检查其中的行:

var obj = $.parseJSON(doc.d);  //.net returns json wrapped in "d"

并检查 JSON 作为来自服务器的变量 d 存储在返回对象中。

尝试在该行之前插入 console.log(doc) 并检查您的浏览器控制台以检查服务器实际返回的内容。

更新

var obj = $.parseJSON(doc.d);替换为var obj = doc,因为ajax方法会自动解析。

【讨论】:

  • 如果我这样做console.log(doc),它会发送相同的内容。当我在var obj = $.parseJSON(doc.d) 上方插入console.log(doc.d) 时,它返回为undefined。当我在解析下console.log(doc.d) 时,它什么也不记录
  • 与“相同”我的意思是它解析我在问题中放置的相同 JSON 格式
  • 你的json字符串是doc不是doc.d,把$.parseJSON(doc.d);替换成$.parseJSON(doc);
  • 当我这样做时,我得到 callback is not a function 作为错误
  • 问题是您的代码中有第二个问题,您的 JSON 数据的格式与您使用的示例不同。 cabrerahector 的更新答案看起来是正确的,现在应该适合你
【解决方案2】:

你不需要这一行:

var obj = $.parseJSON(doc.d);

当您告诉 jQuery 期望的数据类型是 json (dataType: "json") 时,它会尝试为您自动解析它,如果它不是有效的 JSON 对象,则会失败(请参阅 jQuery.getJSON() 了解更多详细信息)。

试试这个:

var obj = doc.d;

更新:

d 确实是未定义的。尝试将您的代码更改为:

var events = [];   //javascript event object created here

$.each( doc, function( index, obj ) {
    events.push({
        title: obj.title,
        start: obj.start,
        end: obj.end
    });
});

callback(events);

【讨论】:

  • 当我尝试var obj = doc.d; 时出现以下错误:Uncaught TypeError: Cannot read property 'event' of undefined
  • console.log( doc ); 返回什么,@FllnAngl?将其放在success: function (doc) { 之后
  • 我已经这样做了,它返回的 JSON 格式与我在问题中的格式相同,但是当我 console.log(doc.d) 它返回 undefined
  • 当我尝试这样做时,我得到以下信息:Uncaught TypeError: Cannot use 'in' operator to search for 'length' in [JSONformat]
  • 这可能是一个不同的问题,@FllnAngl。您的 JSON 对象被解析得很好(请参阅JSFiddle)。您必须提出一个新问题(这次分享整个代码)或编辑您的原始问题以包含我们重现该问题所需的所有内容(请参阅How to create a Minimal, Complete, and Verifiable example)。
猜你喜欢
  • 2019-08-30
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多