2010-06-22 3 views
5

Я использую ksoap2 lib для связи с клиентом android с веб-сервисом SOAP. Большая работа была выполнена командой ksoap, но проблема в том, что нет никакого хорошего примера, как правильно использовать ее в разных аспектах. Например я получаю в ответ мыльный следующие данные:Parsing ksoap2 response

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

Это сложный объект, или, скорее, совокупность объектов StatusSetting. Когда я пытаюсь получить свойство SoapObject, это всего лишь 1 свойство со всеми этими данными в виде строки. Он не может быть проанализирован как json. Невероятно, что никто не сталкивался с той же проблемой в отношении популярности андроида. Было бы здорово узнать, кто-то решил эту проблему и как. Спасибо.

ответ

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

Надеется, что он должен работать

+0

в вышеприведенном случае предположим countryName = "", то оно разобрает его значение как anyType .. т.е. String countryName = anyType .. Любое решение для этого? –

8

Например ваш ответ:

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

Для запроса и разбора сделать так:

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"); 
       } 
      } 
+0

в вышеприведенном случае предположим countryName = "", тогда он проанализирует его значение как anyType .. т.е. String countryName = anyType .. Любое решение для этого? –

+0

Удивительный пример. – neteinstein

+0

@Rooban Ponraj Очень хороший пример, но с этим кодом, получающим только первый набор ответов, как получение только ** Книги ** ответ данных каждый раз, но не получение ** Камеры ** ответ данных ... может кто-нибудь, пожалуйста, помогите мне. Спасибо –

0

Моим Проект - это работа. Надеюсь, это 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"); 
     } 
0

Формат JSON очень удобен. Я написал простой код для преобразования SOAP-ответ V1 в формате 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; 
} 

и использовать эту функцию:

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

Обратите внимание, что я не использую env.bodyIn SoapObject.

Это не может быть идеальным конвертером для всех ответов, поэтому измените «String.replace» и Pattern-Matchers согласно вашему требованию.

+0

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