JSON Cadena devuelta desde el servicio web SOAP que no contiene registros para la tabla

Tengo un servicio web SOAP (.asmx) implementado utilizando el marco .NET que me devuelve una cadena JSON de esta forma:

{"Checkrecord": [{"rollno": "abc2", "porcentaje": 40, "asistido": 12, "perdido": 34}], "Tabla1": []}

Ahora en mi aplicación de Android estoy usando ksoap para llamar al servicio web de la siguiente manera:

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

Estoy recibiendo una respuesta, pero la respuesta no contiene ningún registro y muestra valores en blanco.

Aquí está la respuesta de 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":[]} 

¿Puede alguien decirme por qué está sucediendo esto?

Mi código de servicio web:

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

Edit: He probado mi código de servicio web utilizando una aplicación cliente en .NET y está funcionando bien .. obtener una respuesta adecuada como devuelto JSON cadena con todos los registros y valores.

Parece que este problema se relaciona con algún símbolo específico como: \ lead al error de análisis de jabón.

Usted puede utilizar alguna herramienta como Ethereal para analizar el flujo de entrada y asegúrese de haber recibido correctamente. Si es correcto, puede ser que usted debe codificar datos json y luego enviarlo.

Sólo lo pruebo en mi servidor (lámpara) que devuelven un JSONObject en el cuerpo, y el uso de Android a continuación del código, el trabajo normalmente:

 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) { } } 

Con Etheral, consigo los datos como esto:

 <?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> 

Usted puede encontrar los datos json se han convertido a

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

El protocolo SOAP utiliza XML como medio de comunicación. Su solicitud se convertirá en una cadena XML y la respuesta del servidor será una cadena XML que el KSOap analiza y le proporciona un objeto. Así que parece que la respuesta de WebService está bien, pero hay un problema con el análisis de KSoap. Así que como ustedes estaban discutiendo, puede codificar la cadena en el servidor y devolverla. Android ya proporciona soporte para la codificación / decodificación de Base64.

En el servicio web devuelve lo siguiente en lugar de json.

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

Esto le devolverá una cadena codificada. Así que la respuesta que obtendrá será una cadena codificada. Así que en el lado del cliente de Android.

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

Que le dará u la cadena decodificada. Espero que ayuda

  • Android, Ksoap, webService
  • APP de Android que consume un servicio web cómo autenticar usuarios
  • Creación de un WebService ASP.net que devuelve JSON en lugar de XML
  • Android Obtener archivo pdf como resultado de httppost
  • Tutorial de servicio web de Android
  • Excepción "Caracteres ilegales en la consulta en el índice -" en Android
  • Autenticación entre la aplicación de Android y el servicio web + facebook login
  • SoapFault - código de error: 'soap: Server' faultstring: 'System.Web.Services.Protocols.SoapException:
  • ¿Pasar datos a los servicios web .net y obtener resultados?
  • Cómo alojar un servicio web java RESTful para la aplicación android
  • Necesidad de transferir el archivo .apk mediante webservice
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.