Результатом источника данных KendoUI является недопустимый примитив JSON

Поэтому я целый день бился головой об стену, пытаясь заставить это работать. если это просто и глупо - извините и спасибо. Это довольно длинный пост, поскольку я пытаюсь описать все, что я сделал до сих пор.

Итак, у меня есть веб-сервис ASMX, который я хотел бы использовать для заполнения списка просмотра Kendo UI. Это прекрасно работает, пока я не добавлю данные: в мой запрос на транспортировку. Итак, мой веб-сервис теперь выглядит так:

WebMethod(Description = "Return All Pending Actions Based")]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public PendingActionResult GetPendingActions(string sUsername, string sPassword, string sUserID, string sClubID)
{
   //code is here;
}

И мой полный источник данных выглядит так:

dataSource = new kendo.data.DataSource({
                transport: {
                    read: {
                        type: "POST",
                        data:  "{'sUsername':'admin@mail.com','sPassword':'13123','sUserID':'1539','sClubID':'1'}",
                        url: "http://sdk.domain.com/services/general.asmx/GetPendingActions",
                        contentType: "application/json; charset=utf-8",
                        dataType: "json"
                    }
                },
                schema: {
                        data: "d.Data", // ASMX services return JSON in the following format { "d": <result> }. Specify how to get the result.
                        total: "d.Total",
                        model: {
                            id: "activityID",
                            fields: {
                                activityID: { type: "number", validation: {min: 1, required: true } },
                                taskName: { type: "string" },
                                taskNote: { type: "string" },
                                openDate: { type: "datetime" },
                                dueDate: { type: "datetime" },
                                priority: { type: "number" },
                                statusID: { type: "number" },
                                openedByID: { type: "number" },
                                assignedToID: { type: "number" },
                                statusName: { type: "string" },
                                complete: { type: "bool" }
                            }
                        }
                    }
            });

            that.set("pendingActionsDataSource", dataSource);

Я получаю сообщение об ошибке:

{ "Сообщение":"InvalidJSONprimitive:"\u00261={\u00262=\u0027\u00263=s\u00264=U\u00265=s\u00266= е \ u00267 = г \u00268= п \u00269= а \ u002610 = т \ u002611 = е \u002612=\u0027\u002613=:\u002614=\u0027\u002615= а \ u002616 = d \ u002617 = т \u002618= я \u002619= п \u002620=@\u002621= т \ u002622 = а \u002623= я \u002624= L \u002625=.\u002626= с \ u002627 = о \u002628= т \u002629=\u0027\u002630= \u002631=\u0027\u002632=s\u002633= Р \u002634= а \u002635=s\u002636=s\u002637= ш \u002638= о \u002639= г \u002640=d\u002641=\u0027\u002642=:\u002643=\u0027\u002644=1\u002645=3\u002646=1\u002647=2\u002648=3\u002649=\u0027\u002650= \u002651=\u0027\u002652=s\u002653=U\u002654=s\u002655= е \u002656= г \u002657=I\u002658=D\u002659=\u0027\u002660=:\u002661=\u0027\u002662=1\u002663=5\u002664=3\u002665=9\u002666=\u0027\u002667= \u002668=\u0027\u002669=s\u002670=C\u002671= L \ u002672 = и \u002673= Ь \u002674=I\u002675=D\u002676=\u0027\u002677=:\u002678=\u0027\u002679=1\u002680=\u0027\u002681=}\ ". "u002682="StackTrace":"atSystem.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(Stringinput,Int32depthLimit,JavaScriptSerializerserializer)\ г \natSystem.Web.Script.Serialization.JavaScriptSerializer.DeserializeT\ г \natSystem.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContextcontext,WebServiceMethodDatamethodData)" "ExceptionType":"System.ArgumentException"}

Итак, я начал искать что-то похожее, и обнаружил, что другие люди пропускали "или" в запросе данных, поэтому я попробовал множество его вариантов, попытался использовать JSON.stringify, но ошибка продолжалась. Итак, я пошел в Fiddler, чтобы увидеть, что было отправлено на сервер, и вот моя проблема. Junk отправляется. Fiddler показывает это в TextView, отправляемом на сервер:

0=%7B&1='&2=s&3=U&4=s&5=e&6=r&7=n&8=a&9=m&10=e&11='&12=%3A&13='&14=a&15=d&16=m&17=i&18=n&19=%40&20=m&21=a&22=i&23=l&24=.&25=c&26=o&27=m&28='&29=%2C&30='&31=s&32=P&33=a&34=s&35=s&36=w&37=o&38=r&39=d&40='&41=%3A&42='&43=1&44=3&45=1&46=2&47=3&48='&49=%2C&50='&51=s&52=U&53=s&54=e&55=r&56=I&57=D&58='&59=%3A&60='&61=1&62=5&63=3&64=9&65='&66=%2C&67='&68=s&69=C&70=l&71=u&72=b&73=I&74=D&75='&76=%3A&77='&78=1&79='&80=%7D

(Я выложу картинку в Интернете, чтобы ее было легче увидеть)

Итак, здесь я ясно вижу, что строка отправляется не в правильном формате. Поэтому я решил попробовать это, не используя Kendo dataSource, а просто используя JSON/AJAX. Итак, я напечатал это:

function getPAs() {
    $.ajax({
    type: "POST",
    url: "http://sdk.domain.com/services/general.asmx/GetPendingActions",
    data:  "{'sUsername':'admin@mail.com','sPassword':'13123','sUserID':'1539','sClubID':'1'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: getPAs_Success,
    error: app.onError
    });
}

function getPAs_Success(data, status) {
    console.log("START getPAs_Success");

    var cars = data.d;
    var sout = document.getElementById('nav');
    var output = "";
    $.each(cars, function(index, car) {
    output += '<p><strong>' + car.taskName + ' ' +
                            car.taskNote + '</strong><br /> Priority: ' +
                            car.priority + '<br />Status: ' +
                            car.statusID + '<br />Opened By: ' +
                            car.openedByID + '<br />Assigned To' +
                            car.assignedToID + '</p>';
    });
    sout.innerHTML = output;
    console.log("END getPAs_Success");
}

И если я смотрю на fiddler в TextView, я вижу, что это отправляется на сервер:

{'sUsername':'admin@mail.com','sPassword':'13123','sUserID':'1539','sClubID':'1'}

И я ясно вижу свои результаты JSON в Fiddler.

Итак, мой вопрос после всего этого:

Есть ли что-то особенное, что мне нужно сделать с источником данных Kendo UI, чтобы осуществить это? Если это имеет значение, я использую Icenium и пытаюсь создать быстрое мобильное приложение для развлечения.

Спасибо,

Ричард

ОБНОВЛЕНИЕ № 1 Попробовал и то и другое.

data: {"sUsername": "admin@mail.com", "sPassword": "13123", "sUserID": "1539", "sClubID": "1"},

который проверяет с помощью jsonlint.com, но когда я смотрю на fiddler, я вижу, что это отправляется на сервер:

sUsername = администратор%40mail.com&sPassword=13123&sUserID= &sClubID тысяча пятьсот тридцать-девять = 1

Так что, возможно, это потому, что у меня сейчас нет кавычек вокруг данных, поэтому я попробовал это:

data: '{"sUsername": "admin@mail.com", "sPassword": "13123", "sUserID": "1539", "sClubID": "1"}',

и когда я делаю это, я получаю тот же беспорядок 0=%7... как выше.

Когда я пытаюсь использовать toJSON, я получаю, что объектная функция не имеет метода. Делать что-то вроде этого:

var jsPost = $.toJSON({
                sUsername: "admin@mail.com",
                sPassword: "13123",
                sUserID: "1539",
                sClubID: "1"
            });

На форумах telerik нашелся кто-то, кто сказал, что не следует использовать toJSON, а вместо этого использовать JSON.stringify, поэтому я попробовал это:

var jsPost = {
                sUsername: "admin@mail.com",
                sPassword: "13123",
                sUserID: "1539",
                sClubID: "1"
            };

...

data: JSON.stringify(jsPost),

Но все равно приводит к сумасшедшему мусору.

1 ответ

Для правильного формата JSON нужны двойные кавычки, а не одинарные. Вы можете попробовать проверить свою строку в таких сервисах, как http://jsonlint.com/. Более того, вы можете использовать toJson для объекта вместо того, чтобы создавать его вручную.

Другие вопросы по тегам