在實際開發項目中,有時候會為Android開發團隊提供一些接口,一般是以asmx文件的方式來承載。而公布出去的數據一般上都是標准的json數據。但是在實際過程中,發現Android團隊那邊並不是通過將JSON序列化成類對象來進行解析的(通過parse json數據來進行),所以我這里要提供以下我自己在實際項目中,使用的方法,以期起到拋磚引玉的作用。
我們先在.net端建立兩個WebService對象:
首先,建立一個名稱為GetPhoneUnCharged的對象,用來獲取暫未充值完成的手機列表用戶。
1: #region 總體說明:獲取未發送的手機充值列表
2: [WebMethod(Description = "總體說明:獲取未發送的手機充值列表")]
3: public string GetPhoneUnCharged()
4: {
5: using (var e = new brnmallEntities())
6: {
7: var result = from p in e.cha_phonecharge where p.chargestateid == 1 select p;
8: return JsonConvert.SerializeObject(result.ToList());
9: }
10: }
11: #endregion
12:
從上面代碼可以看出,我們返回的是被Newtonsoft.json組件序列化的json字符串數組。
我們從捕獲的截圖中,可以看到我們返回的JSON字符串數據:
然后,在.net中,我們創建如下的DTO對象:
1: public class cha_phonechargedto
2: {
3: public int phonechargeid { get; set; }
4: public int uid { get; set; }
5: public string chargephone { get; set; }
6: public DateTime? chargetime { get; set; }
7: public int chargestateid { get; set; }
8: public string chargestate { get; set; }
9: public decimal chagemoney { get; set; }
10: public string chargememo { get; set; }
11: public int chargetypeid { get; set; }
12: public int serviceid { get; set; }
13:
14: public string username { get; set; } //用戶名稱
15: public string chargetype { get; set; } //支付,還是繳費
16: public string servicename { get; set; } //運營商名稱
17:
18: public bool error { get; set; }
19: public string message { get; set; }
20: }
21:
這個DTO對象主要就是返回一些用戶數據以供Android客戶端調用。
下面我們來添加我們的WebService方法:
1: #region 總體說明:手工繳費(兼容性放法)
2: [WebMethod(Description = "總體說明:手工繳費(兼容性放法)", MessageName = "ManualCharge")]
3: public string ManualCharge(string phonechargeid)
4: {
5: int phonechargeidInInt32;
6: if (string.IsNullOrEmpty(phonechargeid))
7: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "繳費序號不能為空!" });
8: if (!Int32.TryParse(phonechargeid, out phonechargeidInInt32))
9: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "繳費序號只能為數字型!" });
10:
11: using (var e = new brnmallEntities())
12: {
13: var result = (from p in e.cha_phonecharge where p.phonechargeid == phonechargeidInInt32 select p).FirstOrDefault();
14: if (result == null)
15: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "未找到繳費記錄!" });
16: else
17: {
18: //如果處於可以繳費的模式
19: if (result.chargestateid == 1)
20: {
21: result.chargestateid = 2; //繳費成功
22: result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]自動繳費成功";
23: try
24: {
25: e.SaveChanges();
26: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = false, message = "手工繳費成功!" });
27: }
28: catch (Exception ex)
29: {
30: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = ex.Message });
31: }
32: }
33: else if (result.chargestateid == 2) //如果已經繳費,則無需重復繳費
34: {
35: result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]有重復繳費行為,已被自動處理";
36: }
37: else //其他未知原因,導致的不能繳費的情況
38: {
39: result.chargememo = "於[" + DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss") + "]發現本記錄異常,無法被自動繳費";
40: }
41: }
42: return JsonConvert.SerializeObject(new cha_phonechargedto() { error = true, message = "手工繳費成功!" });
43: }
44: }
45: #endregion
46:
這個方法最后返回的數據為String類型的標准的JSON數據。在返回值中,我已經利用Newtonsoft.json組件將對象轉換成了標准的json數據。
以上就是.net WebService所有的內容了。我們再來看看Android端怎么進行的。
首先,我們需要下載兩個用於json數據解析的jar包:gson-2.2.4.jar 和 ksoap2-android-assembly-2.4-jar-with-dependencies.jar,將其添加到libs目錄下。
其次,我們需要在Android端,創建一個一模一樣的DTO對象:cha_phonechargedto。
然后,開始編寫解析代碼如下:
1: public void run() {
2: System.out.println("Polling...");
3:
4: String nameSpace = "http://tempuri.org/";
5: String serviceURL = "http://******:8001/ChargeService.asmx";
6:
7: String methodName = "GetPhoneUnCharged";
8: String soapAction = "http://tempuri.org/GetPhoneUnCharged";
9: SoapObject request = new SoapObject(nameSpace, methodName);
10:
11: SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
12: SoapEnvelope.VER11);
13: envelope.bodyOut = request;
14: envelope.dotNet = true;
15: HttpTransportSE ht = new HttpTransportSE(serviceURL);
16: ht.debug = false;
17: try {
18: ht.call(soapAction, envelope);
19: if (envelope.getResponse() != null) {
20: String result = envelope.getResponse().toString();
21: Log.d("result", result);
22:
23: Gson gson = new Gson();
24: List<cha_phonechargedto> ps = gson.fromJson(result,new TypeToken<List<cha_phonechargedto>>() {}.getType());
25:
26: for (int i = 0; i < ps.size(); i++) {
27: cha_phonechargedto p = ps.get(i);
28:
29: String phone = p.getChargephone().toString(); // 電話號碼
30: String fee = p.getChagemoney().toString(); // 繳費金額
31: String stuffID = p.getServiceid().toString(); // ServiceCompany 1:電信 2:移動 3:聯通
32: String phonechargeid = p.getPhonechargeid().toString();
33: int feeEx= new Double(fee).intValue();
34:
35: System.out.println(phone + "|" + fee + "|" + stuffID+ "|" + phonechargeid);
36:
37: String messageDaemon = "";
38: String messageTo = "";
39: String smsCenterPhone = "";
40:
117: if (stuffID.equalsIgnoreCase("3")) // 聯通 Send To 10011
118: {
119: messageDaemon = "××××××" + phone + "#" + feeEx;
120: messageTo = "10011";
121: smsCenterPhone = "13000000000";
122: Log.d("result", messageDaemon + "|" + messageTo + "|"+ smsCenterPhone);
123:
124: String methodName1 = "ManualCharge";
125: String soapAction1 = "http://tempuri.org/ManualCharge";
126: SoapObject request1 = new SoapObject(nameSpace,methodName1);
127: // 如果有參數,可以加入,沒有的話,則忽略
128: Log.d("phonechargeid", phonechargeid);
129: request1.addProperty("phonechargeid", phonechargeid);
130:
131: SoapSerializationEnvelope envelope1 = new SoapSerializationEnvelope(SoapEnvelope.VER11);
132: envelope1.bodyOut = request1;
133: envelope1.dotNet = true;
134:
135: ht.call(soapAction1, envelope1);
136: if (envelope1.getResponse() != null) {
137: String operation = envelope1.getResponse().toString();
138: Log.d("operation", operation);
139:
140: Gson gsonResponse = new Gson();
141: cha_phonechargedto resultResponse = gsonResponse.fromJson(operation,new TypeToken<cha_phonechargedto>() {}.getType());
142:
143: boolean errorflag = resultResponse.getError();
144:
145: if(!errorflag) //can send message out
146: {
147: // Send Message Out
148: SmsManager smsManager = SmsManager.getDefault();
149: smsManager.sendTextMessage(messageTo,smsCenterPhone, messageDaemon, null, null);
150:
151: Log.d("result", messageDaemon + " have sent");
152: }
153: }
154: }
155:
156: Thread.sleep(2000);
157: }
158: }
159: } catch (Exception e) {
160: e.printStackTrace();
161:
162: }
163: }
164: }
首先,建立SoapObject來承載要Invoke的函數名稱,然后通過Gson的fromJson方法,將WebService提供的JSON數據,序列化到List<cha_phonechargedto>對象中去。最后就是通過一系列的邏輯,來實現軟件需要實現的目的。
其實說起來挺簡單的。
但是也許有人會問,如果我不知道你們提供的cha_phonechargedto對象里面的內容,咋辦呢? 其實很簡單,網上已經有專門提供JSON數據類生成的服務了,我們可以拿好我們的json數據,直接去生成類去。
我們的json數據如下:
[
{
"$id": "1",
"phonechargeid": 1626,
"uid": 9,
"chargephone": "18239236557",
"chargetime": "2015-02-02T18:05:39.8",
"chargestateid": 1,
"chagemoney": 50,
"chargememo": "網頁端手機充值",
"chargetypeid": 2,
"serviceid": 2,
"EntityKey": {
"$id": "2",
"EntitySetName": "cha_phonecharge",
"EntityContainerName": "brnmallEntities",
"EntityKeyValues": [
{
"Key": "phonechargeid",
"Type": "System.Int32",
"Value": "1626"
}
]
}
},
{
"$id": "3",
"phonechargeid": 1634,
"uid": 9,
"chargephone": "18239236557",
"chargetime": "2015-02-03T10:11:57.143",
"chargestateid": 1,
"chagemoney": 50,
"chargememo": "網頁端手機充值",
"chargetypeid": 2,
"serviceid": 2,
"EntityKey": {
"$id": "4",
"EntitySetName": "cha_phonecharge",
"EntityContainerName": "brnmallEntities",
"EntityKeyValues": [
{
"Key": "phonechargeid",
"Type": "System.Int32",
"Value": "1634"
}
]
}
}
]
然后將上面數據拷貝到http://tools.wx6.org/json2csharp/這個網站中,點擊生成按鈕,可以生成如下的類對象:
1:
2:
3: public class EntityKeyValues
4: {
5: public string Key { get; set; }
6: public string Type { get; set; }
7: public int Value { get; set; }
8: }
9: public class EntityKey
10: {
11: public string EntitySetName { get; set; }
12: public string EntityContainerName { get; set; }
13: public List<EntityKeyValues> EntityKeyValues { get; set; }
14: }
15: public class Root
16: {
17: public int Phonechargeid { get; set; }
18: public int Uid { get; set; }
19: public long Chargephone { get; set; }
20: public DateTime Chargetime { get; set; }
21: public int Chargestateid { get; set; }
22: public int Chagemoney { get; set; }
23: public string Chargememo { get; set; }
24: public int Chargetypeid { get; set; }
25: public int Serviceid { get; set; }
26: public EntityKey EntityKey { get; set; }
27: }
28:
看看,是不是很相似呢? 相信你把這些對象直接轉變為java中的dto對象,該是很簡單的了。
上面有多余字段,你可以不加某些屬性,就可以過濾掉不想要的字段。
期望對你有用,謝謝。

