JSON String возвращается из веб-службы SOAP, не содержащей записей для таблицы - PullRequest
11 голосов
/ 21 ноября 2011

У меня есть веб-служба 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 со всеми записями и значениями.

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

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

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

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

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;:[]}
0 голосов
/ 28 ноября 2011

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

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

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

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

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

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

...