如何在Android中解析此Web服务响应?

如何在Android中解析此Web服务响应?,android,Android,我使用KSOAP2从android应用程序调用.NET web服务,web服务的响应格式如下 anyType{ UserName=anyType{}; Password=anyType{}; ApplicationCode=JOB; ActionType=Query; MessageParameters=anyType{Parameters=anyType{}; }; TableData=anyType{TableNo=167; TableName=Job;

我使用KSOAP2从android应用程序调用.NET web服务,web服务的响应格式如下

anyType{
UserName=anyType{}; 
Password=anyType{}; 
ApplicationCode=JOB; 
ActionType=Query; 
MessageParameters=anyType{Parameters=anyType{}; }; 
TableData=anyType{TableNo=167; 
          TableName=Job; 
      DataRows=
      anyType{
        DataRow=
          anyType{
             DataRowValues=
            anyType{
                DataRowValue=
                anyType{
                    FieldNo=1; 
                    FieldName=No.; 
                    PrimaryKey=true; 
                    FieldType=Code20; DataValue=DEERFIELD, 8 WP; 
                       };
               DataRowValue=
                anyType
                       {
                    FieldNo=3; 
                    FieldName=Description; 
                    PrimaryKey=false; 
                    FieldType=Text50; 
                    DataValue=Setting up Eight Work Areas; 
                       };
             DataRowValue=
                anyType
                       {
                    FieldNo=4; 
                    FieldName=Description 2; 
                    PrimaryKey=false; 
                    FieldType=Text50; 
                    DataValue=anyType{}; 
                       }; 
                }; 
              }; 
           }; 
       }; 
    }; 
 ResponseForRequest=GETTABLEDATA; 
 CustomIdentifier=TestBB; 
Applications=anyType{}; 
Forms=anyType{}; 
Menu=anyType{}; 
}
我不知道此响应的格式,也不知道如何解析此响应以获得特定结果。任何人都知道,请帮助我


注意:为了您的理解,我手动设置了此响应的格式。

我无法识别此格式。我想你得自己分析一下反应

一系列正则表达式似乎是最快的开始

例如:

String intput=“”//您的大响应字符串
列表行=新建ArrayList();
字符串[]rowdata=input.matches(“DataRowValue\=\r\s*任意类型{[^}]*};”);
for(字符串r:rowdata){
Map row=newhashmap();
字符串[]nvpairs=r.split(“;”);
for(字符串对:nvpairs){
字符串[]s=pair.split(“”);
行推送(s[0],s[1]);
}
}
你应该开始了。 出于很多原因,您可能需要调整第一个正则表达式。
类似于“(?如果您了解Java脚本,实际上这是一种已知的格式。这种格式的数据实际上是
JSON对象
JSON数组
。我希望您使用的是
KSOAP2库
。下面是如何解析此结果

例如:

private Bundle bundleResult=new Bundle();
私有JSONObject JSONObject;
私人JSONArray JSONArr;
私有SoapObject resultSOAP=(SoapObject)信封。getResponse();
/*获取JSON字符串中的结果*/
私有字符串ResultObject=resultSOAP.getProperty(0.toString();
if(ResultObject.startsWith(“{”){//如果JSON字符串是对象
JSONObj=新的JSONObject(ResultObject);
迭代器itr=JSONObj.keys();
while(itr.hasNext()){
字符串键=(字符串)itr.next();
字符串值=JSONObj.getString(键);
bundleResult.putString(键、值);
//System.out.println(bundleResult.getString(Key));
}
}else if(ResultObject.startsWith(“[”){//如果JSON字符串是数组
JSONArr=新JSONArray(ResultObject);
System.out.println(“length”+JSONArr.length());
for(int i=0;i

起初,我在处理此类数据时遇到了很多问题,但最终我使所有数据都正常工作。从那时起,我一直在使用这些数据。我希望这能帮助您解决问题。

例如,您的回答:

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");
               }
           }
对于请求和解析,请执行以下操作:

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请求=新的SoapObject(名称空间、方法名称);
//添加web服务所需的输入
请求添加财产(“城市”、“钦奈”);
请求。添加属性(“键”,“10000”);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(请求);
//进行soap调用。
调用(SOAP_操作,信封);
//从信封正文获取SoapResult。
resultRequestSOAP=(SoapObject)envelope.bodyIn;
System.out.println(“*******响应:+resultRequestSOAP.toString());
SoapObject根=(SoapObject)resultRequestSOAP.getProperty(0);
SoapObject s_deals=(SoapObject)root.getProperty(“FOO_deals”);
StringBuilder StringBuilder=新的StringBuilder();
System.out.println(“******计数:+s_deals.getPropertyCount());
对于(int i=0;i
前提是SOAP响应采用有效的JSON格式;接受的回答可能并不总是成功的,因为响应字符串不是以“{”开头,而是以“anyType”开头

在这种情况下,我总是会遇到一个错误,认为“anyType”不是有效的JSON对象。然后,我继续用IndexOf(“{”)对响应字符串进行子串;然后开始解析,不过,如果响应字符串不是有效的JSON格式,它将再次中断

这里的问题是,我的响应字符串包含未转义字符,这与JSON格式不符

关于这一答复:

这就是我设法实现的:

    public Bundle getElementsFromSOAP(SoapObject so){
    Bundle resultBundle = new Bundle();
    String Key = null;
    String Value = null;
    int elementCount = so.getPropertyCount();                  

    for(int i = 0;i<elementCount;i++){
        PropertyInfo pi = new PropertyInfo();
        SoapObject nestedSO = (SoapObject)so.getProperty(i);

        int nestedElementCount = nestedSO.getPropertyCount();
        Log.i(tag, Integer.toString(nestedElementCount));

        for(int ii = 0;ii<nestedElementCount;ii++){
            nestedSO.getPropertyInfo(ii, pi);
            resultBundle.putString(pi.name, pi.getValue().toString());
            //Log.i(tag,pi.getName() + " " + pii.getProperty(ii).toString());
            //Log.i(tag,pi.getName() + ": " + pi.getValue());

        }
    }

    return resultBundle;

}
public Bundle getElementsFromSOAP(SoapObject so){
Bundle resultBundle=新Bundle();
字符串键=null;
字符串值=null;
int elementCount=so.getPropertyCount();
对于(int i=0;iSoapObject响应)
          int cols = response.getPropertyCount();

            for (int i = 0; i < cols; i++) {
                Object objectResponse = (Object) response.getProperty(i);




                SoapObject r =(SoapObject) objectResponse;

                FieldName=(String) r.getProperty("FieldName").toString();

                // Get the rest of your Properties by 
                // (String) r.getProperty("PropertyName").toString();

            }