我想在android中使用ksoap2在WCF服务的请求中传递一个对象数组。
我的xml请求如下:
<tem:bookItems>
<res:bookItem>
<res:name>"abcd"</res:name>
<res:price>150</res:price>
</res:bookItem>
<res:bookItem>
<res:name>"efgh"</res:name>
<res:price>250</res:price>
</res:bookItem>
</tem:bookItems>
我无法找到合适的答案而且我完全陷入了困境。请帮忙。
答案 0 :(得分:0)
您应该对ksoap2中的org.ksoap2.serialization.KvmSerializable
接口感兴趣。
对于任何数组对象,您可以创建public abstract class LiteralArrayVector extends Vector implements KvmSerializable
。
LiteralArrayVector
理想情况下应该遵循:
注册您的肥皂信封对象
public void register(SoapSerializationEnvelope envelope, String namespace, String name)
envelope.addMapping(namespace, name, this.getClass());
registerElementClass(envelope, namespace);
使用private void registerElementClass(SoapSerializationEnvelope envelope, String namespace)
envelope.addMapping(namespace, "", elementClass);
Class elementClass = getElementClass();
//在LiteralArrayVector
的具体类中,比如,ArrayOfBookItem
覆盖getElementClass()
的{{1}},以返回super
元素类
类似的东西:
BookItem
和protected Class getElementClass() {
return new BookItem().getClass();
}
返回元素的名称,&#34; BookItem&#34;
getItemDescriptor
getPropertyInfo()
,KvmSerializable
应该包含PropertyInfo
BookItem
public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {
info.name = getItemDescriptor();
info.type = getElementClass();
}
应该覆盖ArrayOfBookItem
的{{1}},以便它调用register
并拥有LiteralArrayVector
。
当我说super(...)
时,我的意思是将元素的映射添加到new BookItem().register(envelope)
register(...)
看看它是否有帮助!!
答案 1 :(得分:0)
经过大量的搜索和调查,找到了一种非常简单的方法来完成上述工作。我刚刚更改了我的服务以接受一个JSON对象数组而不是对象列表。它像魅力一样工作,问题在几分钟内解决了。 这是修改的服务请求,
<tem:bookItems>[{"name": "abcd", "price": "150"}, { "name": "efgh", "price": "250"} ]</tem:bookItems>
从应用程序我们传递对象,
JSONArray jsonArr = new JSONArray();
JSONObject bookObj = new JSONObject();
try {
bookObj.put("name","abcd");
bookObj.put("price","150");
} catch (JSONException e) {
e.printStackTrace();
}
jsonArr.put(bookObj);
}
//the below string will be passed to service
String bookItems = jsonArr.toString();