如何在Android中解析此Web服务响应?
我使用KSOAP2从android应用程序调用.NET web服务,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;
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();
}