Служба WCF принимает простую строку JSON, но отклоняет набор JSON с ошибкой 400

В настоящее время я работаю над приложением PhoneGap, которое взаимодействует с нашей базой данных через веб-службу WCF.

Я сделал много запросов к серверу и получил данные без проблем, но в каждом случае я передавал только пару параметров в виде строки JSON, которую я создал вручную (без строкового преобразования). Теперь я столкнулся с проблемой при попытке чтения из моей локальной базы данных SQLite и последующей отправке информации в виде JSON в веб-службу. Служба возвращает ошибку 400 со следующим:

Ошибка десериализации тела сообщения запроса для операции 'uploadData'. OperationFormatter обнаружил недопустимое тело сообщения. Ожидается найти атрибут с именем «тип» и значением «объект». Найдено значение "массив".

Я кодирую JSON следующим образом:

database.transaction(function(tx) {
    var query = "SELECT * FROM someTable WHERE something=something";
    tx.executeSql(query, [], function(tx, results) {
        var resultSet = new Array();

        for (i=0; i<results.rows.length; i++) {
            var row = results.rows.item(i);
            resultSet[i] = row;         
        }

        var json = JSON.stringify(resultSet);
    }
}

Затем я отправляю строку JSON через запрос ajax с помощью jQuery:

$.ajax({
            type: "POST",
            url: "http://someurl/myService.svc/uploadData",
            contentType: "application/json; charset=utf-8",
            data: json,
            dataType: "json",
            success: function (data) {/*do something*/}, 
            error: function(jqXHR, textStatus, errorThrown) {
                $('#test').html(textStatus + " - " + errorThrown + " - " + jqXHR.responseText);
            }
        }); 

Моя веб-служба просто продолжает выдавать ту же ошибку. У меня такой вопрос ... Как я могу читать из локальной базы данных и преобразовывать набор результатов в пригодную для использования строку JSON для отправки через ajax.

Заранее спасибо. Если требуется дополнительная информация или проблема неясна, сообщите мне, и я сделаю все возможное, чтобы предоставить дополнительную информацию.

РЕДАКТИРОВАТЬ: Пытался удалить строку, но все еще получаю ошибку 400.Однако на этот раз ошибка немного отличается:

Ошибка десериализации тела сообщения запроса для операции 'uploadData'. OperationFormatter обнаружил недопустимое тело сообщения. Обнаружен неожиданный персонаж "u".

РЕДАКТИРОВАТЬ: Я обнаружил, что даже совершенно корректная строка JSON, созданная вручную, по-прежнему вызывает ошибку. Этого не происходит при отправке пары параметров, таких как:

{"name" : "dean", "age" : 23}

Работает отлично. Он отклоняет только наборы результатов, такие как:

[{"name" : "dean", "age" : 23},{"name" : "bob", "age" : 25}]

Метод определен в интерфейсе WCF следующим образом:

 [OperationContract]
 [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json,
          RequestFormat = WebMessageFormat.Json)]

 string uploadData(string data);

Кажется, это больше проблема со службой WCF, чем с самой строкой JSON. Кто-нибудь знает, почему WCF принимает простую строку JSON, но отклоняет набор? Это серьезная проблема, которая полностью остановила разработку проекта, поэтому мы будем благодарны за любую помощь!

РЕШЕНИЕ: Вместо прямой передачи закодированной строки JSON я вместо этого отправлял ее как значение другой строки JSON с ключом «данные». Итак, как и выше, мои результаты SQLite выглядят так:

var json = JSON.stringify(resultSet);

Затем я передаю их в службу WCF следующим образом:

...
data: JSON.stringify({ data : json }),
...

И теперь он работает нормально.

6
задан dekin88 23 February 2012 в 12:14
поделиться