4

I use a ksoap2 lib for communicating from android client with SOAP web service. Great job was done by ksoap team, but the problem is, there is no any good example how to use it correct in different aspects. For instance I get in soap response following data:

anyType{
    StatusSetting=anyType{Id=1; Name=Til afskrivning; LocationId=1; Editable=true; Default=true; Transcribed=false; }; 
    StatusSetting=anyType{Id=2; Name=Afskrevet; LocationId=1; Editable=false; Default=false; Transcribed=true; }; 
    ...
}

It's a complex object, or rather a collection of StatusSetting objects. When I try to get a property of SoapObject it's only 1 property with all that data as a string. It can't be parsed as json too. Unbelievable that nobody met same problem regarding to popularity android is gaining. Would be very cool to know if somebody solved this issue and how. Thanks.

Pentium10
  • 204,586
  • 122
  • 423
  • 502
Maxim
  • 4,152
  • 8
  • 50
  • 77

5 Answers5

8

For example your Response:

anyType
{
  FOO_DEALS=anyType
  {
       CATEGORY_LIST=anyType
       {
         CATEGORY=Books; 
         CATEGORY_URL=books_chennai; 
         CATEGORY_ICON=http://deals.foo.com/common/images/books.png; 
         CATEGORY_COUNT=1045; 
         TYPE=1; 
         SUPERTAG=Books; 
       };
       CATEGORY_LIST=anyType
       {
           CATEGORY=Cameras;
           CATEGORY_URL=cameras_chennai;
           CATEGORY_ICON=http://deals.foo.com/common/images/cameras.png; 
           CATEGORY_COUNT=152; 
           SUPERTAG=Cameras; 
           TYPE=1; 
       }; 
   }; 
 }

For requesting and parsing do like this:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
           // Add the input required by web service
           request.addProperty("city","chennai");
           request.addProperty("key","10000");

           SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(SoapEnvelope.VER11);
           envelope.setOutputSoapObject(request);

           // Make the soap call.
           androidHttpTransport.call(SOAP_ACTION, envelope);

           // Get the SoapResult from the envelope body.
           resultRequestSOAP = (SoapObject) envelope.bodyIn;


           System.out.println("********Response : "+resultRequestSOAP.toString());

           SoapObject root = (SoapObject) resultRequestSOAP.getProperty(0);
           SoapObject s_deals = (SoapObject) root.getProperty("FOO_DEALS");

           StringBuilder stringBuilder = new StringBuilder();

           System.out.println("********Count : "+ s_deals.getPropertyCount());

           for (int i = 0; i < s_deals.getPropertyCount(); i++) 
           {
               Object property = s_deals.getProperty(i);
               if (property instanceof SoapObject)
               {
                   SoapObject category_list = (SoapObject) property;
                   String CATEGORY = category_list.getProperty("CATEGORY").toString();
                   String CATEGORY_URL = category_list.getProperty("CATEGORY_URL").toString();
                   String CATEGORY_ICON = category_list.getProperty("CATEGORY_ICON").toString();
                   String CATEGORY_COUNT = category_list.getProperty("CATEGORY_COUNT").toString();
                   String SUPERTAG = category_list.getProperty("SUPERTAG").toString();
                   String TYPE = category_list.getProperty("TYPE").toString();
                   stringBuilder.append
                   (
                        "Row value of: " +(i+1)+"\n"+
                        "Category: "+CATEGORY+"\n"+
                        "Category URL: "+CATEGORY_URL+"\n"+
                        "Category_Icon: "+CATEGORY_ICON+"\n"+
                        "Category_Count: "+CATEGORY_COUNT+"\n"+
                        "SuperTag: "+SUPERTAG+"\n"+
                        "Type: "+TYPE+"\n"+
                        "******************************"
                   );                   
                   stringBuilder.append("\n");
               }
           }
Rooban Ponraj A
  • 281
  • 4
  • 20
  • in above case suppose countryName = "" then it parse its value as anyType.. ie. String countryName = anyType.. Any solution for that ? – Vishal Khakhkhar Dec 30 '13 at 05:59
  • @Rooban Ponraj A very nice example but with this code getting only first set of response like getting only **Books** data response every time but not getting **Cameras** data response...can anyone please help me out. Thanks – Ashish Tikarye Jan 23 '17 at 05:21
4
SoapObject countryDetails = (SoapObject)envelope.getResponse();
System.out.println(countryDetails.toString());

ArrayList list = new ArrayList(countryDetails.getPropertyCount());
lv_arr = new String[countryDetails.getPropertyCount()];
for (int i = 0; i < countryDetails.getPropertyCount(); i++) {
    Object property = countryDetails.getProperty(i);
    if (property instanceof SoapObject) {
        SoapObject countryObj = (SoapObject) property;
        String countryName = countryObj.getProperty("countryName").toString();
        list.add(countryName );
    }
}

Hope it should work

madlymad
  • 6,367
  • 6
  • 37
  • 68
mac
  • 4,760
  • 7
  • 31
  • 33
  • in above case suppose countryName = "" then it parse its value as anyType.. ie. String countryName = anyType.. Any solution for that ? – Vishal Khakhkhar Dec 30 '13 at 05:59
2

Here is a tutorial on how to work with array of complex objects with KSOAP. I found out by countless hours of debugging. Hope this hepls

DFDF
  • 56
  • 3
1

My Project it's work. Hope this hepls.

        SoapObject requestx = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope envelopex = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelopex.dotNet = true;
        envelopex.setOutputSoapObject(requestx);
        HttpTransportSE httpTransportx = new HttpTransportSE(URL);          

        try  {                    
            httpTransportx.call(SOAP_ACTION, envelopex);
            SoapObject responsex = (SoapObject)envelopex.getResponse(); // not envelopex.bodyIn;

             int i=0;
             int RCount=responsex.getPropertyCount();
             int[] tbIDArray = new int[RCount+1];
             int[] iMonthAarray = new int[RCount+1];
             int[] iYearAarray = new int[RCount+1];
             String[] sDetailAarray = new String[RCount+1];

             for (i = 0; i < RCount; i++) {
                 Object property = responsex.getProperty(i);
                 if (property instanceof SoapObject) {
                     SoapObject info = (SoapObject) property;
                     String tbID = info.getProperty("tbID").toString();
                     String iMonth = info.getProperty("iMonth").toString();
                     String iYear = info.getProperty("iYear").toString();
                     String sDetail = info.getProperty("sDetail").toString();

                    tbIDArray[i] =Integer.valueOf(tbID);
                    iMonthAarray[i] =Integer.valueOf(iMonth);
                    iYearAarray[i] =Integer.valueOf(iYear);
                    sDetailAarray[i] =sDetail;
                 }//if (property instanceof SoapObject) {
             }//for (i = 0; i < RCount; i++) {


        }  catch (Exception exception)   {
            MsgBox1(exception.toString() , "Error");
        }
mahasam
  • 829
  • 7
  • 8
0

JSON format is much comfortable. I wrote a simple code to convert SOAP V1 response to JSON:

public static String soapStrToJson(String input)
{
    String output;

    output = input;
    output = output.replace("key=", "\"");
    output = output.replace("; value=", "\":");
    output = output.replace("; };",",");
    output = output.replace("item=anyType{","");
    output = output.replace("Map","");
    output = output.replace(",}","}");
    output = output.replace(", }"," }");
    output = output.replace("null","0");

    Pattern pattern = Pattern.compile(":(.*?),");
    Matcher matcher = pattern.matcher(output);

    List<String> wordsToReplace = new ArrayList();
    while (matcher.find())
    {
        String str = matcher.group(0);
        if(str.contains("{") || str.contains("["))
            continue;

        str = str.replace(":", "");
        str = str.replace(",", "");

        if(str.matches("^-?\\d+$"))
            continue;

        System.out.println("-->" + str);
        wordsToReplace.add(str);
    }

    for(String str : wordsToReplace)
    {
        output = output.replace(":"+str+",", ":\""+str+"\",");
    }
    return output;
}

and used this function as:

parseCategoryJSON( new JSONObject( soapStrToJson( env.getResponse().toString() ) ) )

Note that I am not using env.bodyIn SoapObject.

This may not be the perfect converter for all responses, so modify 'String.replace' and Pattern-Matchers as per your requirement.

Ankur
  • 1,268
  • 18
  • 22
  • If this question is a duplicate of the linked question, please close it as a duplicate instead of leaving an answer to that effect. If it is not a duplicate, please leave a complete answer instead of a link-only answer. – josliber Jan 19 '16 at 15:40