Анализ ответа ksoap2

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

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. Невероятно, что никто не сталкивался с той же проблемой, что и популярность андроида. Было бы здорово узнать, разрешил ли кто-нибудь эту проблему и как. Благодарю.

Вот учебник о том, как работать с массивом сложных объектов с помощью KSOAP . Я узнал бесчисленные часы отладки. Надеюсь, что это hepls

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

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

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

Мой проект – это работа. Надеюсь, что это будет.

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

Формат 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 согласно вашему требованию.