Intereting Posts
Как отобразить непрочитанный счет в значке приложения Android? Вход в Android Twitter не работает с Fabric SDK – Обратный звонок не должен быть пустым Случайное исключение «Получатель не зарегистрировано» Как я могу реализовать простой AsyncTaskLoader? Почему Android разрешает устанавливать APK с истекшим сертификатом? Как определить «инфляцию» в Android Android-панель действий поддержки не показывает меню переполнения Обработка перехода нескольких геообъектов с общей областью Проблемы с рендерингом в Android Studio Есть ли рекомендуемая стратегия для выпуска бета-версии приложения для ограниченного числа пользователей через Android Market? Как программно переключить вкладки в android из фрагмента? Создание ListView с настраиваемыми элементами списка программным способом в Android – нет элемента списка элементов xml Самый простой способ написать и прочитать XML 23.2.0 векторный векторный фон в 4.X Android – открыть или перезапустить приложение после нажатия push-уведомления с использованием действий флага

Строка JSON возвращается из веб-службы SOAP, не содержащей записей для таблицы

У меня есть веб-служба SOAP (.asmx), реализованная с использованием платформы .NET, которая возвращает мне строку JSON в этой форме:

{ "Checkrecord": [{ "rollno": "abc2", "процент": 40, "участие": 12, "пропустили": 34}], "Таблица1": []}

Теперь в моем приложении для Android я использую ksoap для вызова веб-службы следующим образом:

public String getjsondata(String b) { String be=""; SoapObject request = new SoapObject(namespace, method_NAME); request.addProperty("rollno",b); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE android = new HttpTransportSE(url); android.debug = true; try { //android.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); android.call(soap_ACTION, envelope); SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); Log.i("myapp",result.toString()); System.out.println(" --- response ---- " + result); be=result.toString(); if (be.startsWith("[")) { // if JSON string is an array JSONArr = new JSONArray(be); System.out.println("length" + JSONArr.length()); for (int i = 0; i < JSONArr.length(); i++) { JSONObj = (JSONObject) JSONArr.get(i); bundleResult.putString(String.valueOf(i), JSONObj.toString()); System.out.println("bundle result is"+bundleResult); } } } catch (SocketException ex) { ex.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return be; } 

Я получаю ответ, но ответ не содержит записей и показывает пустые значения.

Вот ответ от Logcat:

  11-21 20:13:03.283: INFO/myapp(1173): {"checkrecord":[],"Table1":[]} 11-21 20:13:03.283: INFO/System.out(1173): --- response ---- {"checkrecord":[],"Table1":[]} 

Может ли кто-нибудь сказать мне, почему это происходит?

Мой код веб-сервиса:

  using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Data.SqlClient; namespace returnjson { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public String getdata(String rollno) { String json; try { using (SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123")) { string select = "select * from checkrecord where rollno=\'" + rollno + "\'"; SqlDataAdapter da = new SqlDataAdapter(select, myConnection); DataSet ds = new DataSet(); da.Fill(ds, "checkrecord"); DataTable dt = new DataTable(); ds.Tables.Add(dt); json = Newtonsoft.Json.JsonConvert.SerializeObject(ds); } } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } return json; } } } 

Редактирование: я проверил код веб-службы с помощью клиентского приложения в .NET и отлично работает. Запустив правильный ответ в соответствии с возвращенной строкой JSON со всеми записями и значениями.

Solutions Collecting From Web of "Строка JSON возвращается из веб-службы SOAP, не содержащей записей для таблицы"

Кажется, эта проблема связана с некоторым конкретным символом, например: \ привести к ошибке синтаксического анализа.

Вы можете использовать какой-то инструмент, например Ethereal, для анализа входного потока и убедитесь, что вы получили его правильно. Если это правильно, может быть, вы должны закодировать данные json, а затем отправить его.

Я просто тестирую его на своем сервере (лампе), которые возвращают JSONObject в теле, а андроид используют ниже кода, работают нормально:

 public static void testApi() { AndroidHttpTransport androidHttptt = new AndroidHttpTransport("http://172.16.0.178/1mobile/market/services.php"); SoapObject request = new SoapObject(NAMESPACE, "check_error"); // request.addProperty("data", "empty"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); Element[] header = new Element[1]; header[0] = new Element().createElement(NAMESPACE, "Credentials"); envelope.dotNet = true; envelope.headerOut = header; envelope.setOutputSoapObject(request); AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(url); androidHttpTransport.setXmlVersionTag(XML_HEAD); try { androidHttptt.call("http://172.16.0.178/check_error", envelope); SoapObject response = (SoapObject) envelope.getResponse(); Log.e("response", "response=" + response.toString()); } catch (Exception e) { } } 

С Etheral, я получаю данные следующим образом:

 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:check_errorResponse xmlns:ns1="http://test.test.com"> <Result xsi:type="xsd:string">{&quot;checkrecord&quot;:[{&quot;rollno&quot;:&quot;abc2&quot;,&quot;percentage&quot;:40,&quot;attended&quot;:12,&quot;missed&quot;:34}],&quot;Table1&quot;:[]}</Result> </ns1:check_errorResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Вы можете найти, что данные json были преобразованы в

 {&quot;checkrecord&quot;:[{&quot;rollno&quot;:&quot;abc2&quot;,&quot;percentage&quot;:40,&quot;attended&quot;:12,&quot;missed&quot;:34}],&quot;Table1&quot;:[]} 

Протокол SOAP использует XML как средство коммуникации. Ваш запрос будет преобразован в строку XML, а ответ с сервера будет XML-строкой, которую KSOap анализирует и предоставляет вам объект. Таким образом, похоже, что ответ от WebService прекрасен, но есть проблема с разбором KSoap. Так, как вы, ребята, обсуждали, вы можете закодировать String на сервере и вернуть его. Android уже поддерживает поддержку кодировки / декодирования Base64.

В webservice верните вместо json следующее.

 Convert.ToBase64String (Encoding.UTF8.GetBytes (json)); 

Это вернет вам закодированную строку. Таким образом, ответ, который вы получите, будет закодированной строкой. Таким образом, на стороне клиента Android.

 new String(android.util.Base64.decode(responseString.getBytes(),android.util.Base64.DEFAULT)) 

Который даст декодированную строку. Надеюсь, что это поможет