В настоящее время я работаю над приложением PhoneGap, которое связывается с нашей базой данных через веб-сервис WCF.
Я сделал много запросов к серверу и получил данные без проблем, но в каждом случае я передавал только пару параметров в виде строки JSON, которую я создал вручную (без stringify).Теперь я столкнулся с проблемой при попытке прочитать из моей локальной базы данных 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 }),
...
И теперь она работает нормально.