解析数据

时间:2018-02-21 14:50:01

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

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

我正在尝试使用AJAX从我的控制器获取数据以放入jQuery FullCalendar, 既然我对我的控制器相当自信,我仍然会收到错误说:

  

位于0位置的json中的意外标记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');
                },
            });
        }

谢谢!

2 个答案:

答案 0 :(得分:0)

你说你已经复制了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方法会自动解析。

答案 1 :(得分:0)

您不需要这一行:

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);