android中的项目用的是webservice接口,用到的jar为:ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar,返回的数据格式是soap 。解析的过程碰到了属性太多,一个一个去解析太费时,网上找半天也没有开源的解析工具,不像json的解析工具有:fastjson等解析工具
所以 只能自己动手。。。
具体的代码如下:
解析单个的对象
public static <T> T checkSoap(SoapObject text, Class<T> clazz) {
Object newObject = null;
try {
newObject = clazz.newInstance();
Field[] declaredFields = clazz.getDeclaredFields();//获取属性
for (int i = 0; i < text.getPropertyCount(); i++) {
Object object =text.getProperty(i);
SoapPrimitive soapPrimitive=null;
SoapObject soapobject=null;
if(object instanceof SoapObject){
soapobject=(SoapObject)object;
}else {
soapPrimitive=(SoapPrimitive)object;
}
for (Field filed : declaredFields) {
String filednameString = filed.getName().toString();
if (soapobject!=null&&soapobject.hasProperty(filednameString)) {
String firstLetter = filed.getName().substring(0, 1)
.toUpperCase();
String setMethodName = "set" + firstLetter
+ filed.getName().substring(1);
Object value;
value = getSoapValue(filed, soapobject);
Method setMethod = clazz.getMethod(setMethodName,
new Class[] { filed.getType() });
setMethod.invoke(newObject, new Object[] { value });
}else {
String firstLetter = filed.getName().substring(0, 1)
.toUpperCase();
String setMethodName = "set" + firstLetter
+ filed.getName().substring(1);
Object value;
value = getSoapValue(filed, text);
Method setMethod = clazz.getMethod(setMethodName,
new Class[] { filed.getType() });
setMethod.invoke(newObject, new Object[] { value });
}
}
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
// TODO Auto-generated catch blockD
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return (T) newObject;
}
解析list对象
public static <T> ArrayList<T> checkList(SoapObject text2, Class<T> clazz) {
ArrayList<T> hhArrayList = new ArrayList<T>();
for (int j = 0; j < text2.getPropertyCount(); j++) {
SoapObject text = (SoapObject) text2.getProperty(j);
Object newObject = null;
try {
newObject = clazz.newInstance();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field filed : declaredFields) {
String filednameString = filed.getName().toString();
if (text.hasProperty(filednameString)) {
String firstLetter = filed.getName()
.substring(0, 1).toUpperCase();
String setMethodName = "set" + firstLetter
+ filed.getName().substring(1);
Object value;
value = getSoapValue(filed, text);
Method setMethod = clazz.getMethod(setMethodName,
new Class[] { filed.getType() });
setMethod.invoke(newObject, new Object[] { value });
}
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
hhArrayList.add((T) newObject);
}
return hhArrayList;
}
获取对应属性的值
public static Object getSoapValue(Field filed, SoapObject text) {
Object value;
if (filed.getType().equals(String.class)) {
if (text.getPropertySafely(filed.getName().toString()) == null)
value = "";
else
value = text.getPropertySafely(filed.getName().toString())
.toString();
} else if (filed.getType().equals(Integer.class)) {
if (text.getPropertySafely(filed.getName()) == null)
value = 0;
else
value = Integer.valueOf(text.getPropertySafely(filed.getName())
.toString());
} else if (filed.getType().equals(Boolean.class)) {
if (text.getPropertySafely(filed.getName()) == null)
value = true;
else
value = Boolean.parseBoolean(text.getPropertySafely(
filed.getName()).toString());
} else if (filed.getType().equals(Long.class)) {
if (text.getPropertySafely(filed.getName()) == null)
value = 0L;
else
value = Long.valueOf(text.getPropertySafely(filed.getName())
.toString());
} else if (filed.getType().equals(Float.class)) {
if (text.getPropertySafely(filed.getName()) == null)
value = 0.0F;
else
value = Float.valueOf(text.getPropertySafely(filed.getName())
.toString());
} else if (filed.getType().equals(Double.class)) {
if (text.getPropertySafely(filed.getName()) == null)
value = 0.00D;
else
value = Double.valueOf(text.getPropertySafely(filed.getName())
.toString());
} else if (filed.getType().equals(Date.class)) {
value = DateUtil.strToDate(text.getPropertySafely(filed.getName())
.toString(), DateUtil.FMT_DATE_DDMMYYYYHHmmss_T);
if(value==null)
value = DateUtil.strToDate(text.getPropertySafely(filed.getName())
.toString(), DateUtil.FMT_DATE_DDMMYYYYHHmmss_ST);
if(value==null)
value = DateUtil.strToDate(text.getPropertySafely(filed.getName())
.toString(), DateUtil.FMT_DATE_YYYYMMDDHHmmss_);
} else if (filed.getType().equals(List.class)
|| filed.getType().equals(ArrayList.class)) {
SoapObject ddObject = (SoapObject) text.getPropertySafely(filed
.getName());
ParameterizedType pt = (ParameterizedType) filed.getGenericType();
if (ddObject == null) {
value = null;
} else
value = checkList(ddObject,
(Class) pt.getActualTypeArguments()[0]);
} else {
Object o=text.getPropertySafely(filed.getName());
if(o instanceof SoapObject){
value = checkSoap(
(SoapObject) text.getPropertySafely(filed.getName()),
filed.getClass());
}else if(o instanceof SoapPrimitive
){
value= checkPrimitive((SoapPrimitive) text.getPropertySafely(filed.getName()),
filed.getClass());
}else{
value=null;
}
}
return value;
}