c# 通过访问URL,获取并解析远程服务端返回的复杂Json数据

  最近在做一个业务需求,需要通过速卖通提供的API,抓取速卖通订单数据到本地数据库。

  速卖通官方提供了很多API及测试工具,抓取数据功能的实现基本上不存在问题,比较麻烦的是,ALi服务端传回来的订单列表是Json格式的。解析起来还是相当头疼的。

  在此分享出本人的解析方法,个人感觉的比较愚笨的处理方式,希望各位大神给出更好的建议。

  ALi提交的URL请求格式为:http://gw.api.alibaba.com:80/openapi/param2/1/aliexpress.open/api.findOrderListQuery/YOUR_APPKEY?page=1&pageSize=50&createDateStart=10%2F15%2F2013&createDateEnd=10%2F16%2F2013&orderStatus=WAIT_SELLER_SEND_GOODS&access_token=01ecdeb3-a577-409d-9e6e-137031d8e6e3&_aop_signature=AFFB2B414CAA7D62B12E8C1E04D83DAC00B4EC80

  其中参数内容为:

  page=1   从第一页开始获取

  pageSize=50   每页显示50条数据(ALi最大每页只能显示50条数据)

  createDateStart=10%2F15%2F2013   抓取数据开始时间 10/15/2013

  createDateEnd=10%2F16%2F2013   抓取数据结束时间 10/16/2013

  orderStatus=WAIT_SELLER_SEND_GOODS  抓取订单状态

  access_token  授权令牌

  &_aop_signature 授权签名

  通过URL获取回来的Json格式如下:

  

  1 {
  2     //订单总数
  3     "totalItem": 2,
  4     //订单列表
  5     "orderList": [
  6         {
  7             //子订单列表
  8             "productList": [
  9                 {
 10                     子订单ID
 11                     "childId": 60249667848471,
 12                     //备货时间
 13                     "goodsPrepareTime": 3,
 14                     //物流金额
 15                     "logisticsAmount": {
 16                         "amount": 4.53,
 17                         "cent": 453,
 18                         "currencyCode": "USD",
 19                         "centFactor": 100,
 20                         "currency": {
 21                             "defaultFractionDigits": 2,
 22                             "currencyCode": "USD",
 23                             "symbol": "$"
 24                         }
 25                     },
 26                     //订单备注
 27                     "memo": "",
 28                     //卖家FirstName
 29                     "sellerSignerFirstName": "Lily",
 30                     //总产品金额
 31                     "totalProductAmount": {
 32                         "amount": 47.99,
 33                         "cent": 4799,
 34                         "currencyCode": "USD",
 35                         "centFactor": 100,
 36                         "currency": {
 37                             "defaultFractionDigits": 2,
 38                             "currencyCode": "USD",
 39                             "symbol": "$"
 40                         }
 41                     },
 42                     //限时达
 43                     "freightCommitDay": "60",
 44                     //子订单是否能提交纠纷
 45                     "canSubmitIssue": false,
 46                     //产品单位
 47                     "productUnit": "piece",
 48                     //物流类型
 49                     "logisticsType": "CPAM",
 50                     //纠纷状态
 51                     "issueStatus": "NO_ISSUE",
 52                     //订单号
 53                     "orderId": 60249667848471,
 54                     //物流服务商
 55                     "logisticsServiceName": "China Post Air Mail",
 56                     //子订单状态
 57                     "sonOrderStatus": "PLACE_ORDER_SUCCESS",
 58                     //产品镜像链接
 59                     "productSnapUrl": "http://www.aliexpress.com/snapshot/275258937.html",
 60                     //假一赔三
 61                     "moneyBack3x": false,
 62                     //SKU编号
 63                     "skuCode": "MH0608W",
 64                     //产品ID
 65                     "productId": 1080625782,
 66                     //产品数量
 67                     "productCount": 1,
 68                     //妥投时间
 69                     "deliveryTime": "15-60",
 70                     //产品单位价格
 71                     "productUnitPrice": {
 72                         "amount": 47.99,
 73                         "cent": 4799,
 74                         "currencyCode": "USD",
 75                         "centFactor": 100,
 76                         "currency": {
 77                             "defaultFractionDigits": 2,
 78                             "currencyCode": "USD",
 79                             "symbol": "$"
 80                         }
 81                     },
 82                     //卖家LastName
 83                     "sellerSignerLastName": "Zheng",
 84                     //产品图片链接
 85                     "productImgUrl": "http://img.alibaba.com/ordersnapshot//2013Q4_photo/137/437/275258937/1080625782_1.summ.jpg",
 86                     //状态显示
 87                     "showStatus": "PLACE_ORDER_SUCCESS",
 88                     //产品名称
 89                     "productName": "9500 Mini 3.5\" Capacitive Screen Android4.1 SC6820 Cheap Smartphone Dual SIM Quadband GSM WiFi Bluetooth Camera HK Free Shipping"
 90                 }
 91             ],
 92             //纠纷状态
 93             "issueStatus": "NO_ISSUE",
 94             //冻结状态
 95             "frozenStatus": "NO_FROZEN",
 96             //买家登录ID
 97             "buyerLoginId": "ar1008081320",
 98             //卖家全名
 99             "sellerSignerFullname": "Lily Zheng",
100             //
101             "hasRequestLoan": false,
102             //订单号
103             "orderId": 60249667848471,
104             //支付金额
105             "payAmount": {
106                 "amount": 52.52,
107                 "cent": 5252,
108                 "currencyCode": "USD",
109                 "centFactor": 100,
110                 "currency": {
111                     "defaultFractionDigits": 2,
112                     "currencyCode": "USD",
113                     "symbol": "$"
114                 }
115             },
116             //订单创建
117             "gmtCreate": "20131005163933000-0700",
118             //订单状态
119             "orderStatus": "PLACE_ORDER_SUCCESS",
120             //买家全名
121             "buyerSignerFullname": "graciela antosiuk",
122             //超时剩余时间
123             "timeoutLeftTime": 1267998346,
124             //资金状态
125             "fundStatus": "NOT_PAY",
126             //订单类型
127             "bizType": "AE_COMMON"
128         },
129 
130         {
131             "productList": [
132                 {
133                     "childId": 60244727279620,
134                     "goodsPrepareTime": 3,
135                     "logisticsAmount": {
136                         "amount": 4.53,
137                         "cent": 453,
138                         "currencyCode": "USD",
139                         "centFactor": 100,
140                         "currency": {
141                             "defaultFractionDigits": 2,
142                             "currencyCode": "USD",
143                             "symbol": "$"
144                         }
145                     },
146                     "memo": "",
147                     "sellerSignerFirstName": "Lily",
148                     "totalProductAmount": {
149                         "amount": 86.69,
150                         "cent": 8669,
151                         "currencyCode": "USD",
152                         "centFactor": 100,
153                         "currency": {
154                             "defaultFractionDigits": 2,
155                             "currencyCode": "USD",
156                             "symbol": "$"
157                         }
158                     },
159                     "freightCommitDay": "60",
160                     "canSubmitIssue": false,
161                     "productUnit": "piece",
162                     "logisticsType": "CPAM",
163                     "issueStatus": "NO_ISSUE",
164                     "orderId": 60244727279620,
165                     "logisticsServiceName": "China Post Air Mail",
166                     "sonOrderStatus": "PLACE_ORDER_SUCCESS",
167                     "productSnapUrl": "http://www.aliexpress.com/snapshot/275102127.html",
168                     "moneyBack3x": false,
169                     "skuCode": "CE0351W",
170                     "productId": 905202127,
171                     "productCount": 1,
172                     "deliveryTime": "15-60",
173                     "productUnitPrice": {
174                         "amount": 86.69,
175                         "cent": 8669,
176                         "currencyCode": "USD",
177                         "centFactor": 100,
178                         "currency": {
179                             "defaultFractionDigits": 2,
180                             "currencyCode": "USD",
181                             "symbol": "$"
182                         }
183                     },
184                     "sellerSignerLastName": "Zheng",
185                     "productImgUrl": "http://img.alibaba.com/ordersnapshot//2013Q4_photo/127/127/275102127/905202127_1.summ.jpg",
186                     "showStatus": "PLACE_ORDER_SUCCESS",
187                     "productName": "SANEI N78 Phone Call Tablet PC 7'' Capacitive Screen Crotex A9 MTK6515 Android 4.0 Dual Camera Bluetooth SIM Card Slot 3G HDMI"
188                 }
189             ],
190             "issueStatus": "NO_ISSUE",
191             "frozenStatus": "NO_FROZEN",
192             "buyerLoginId": "ng1014998014",
193             "sellerSignerFullname": "Lily Zheng",
194             "hasRequestLoan": false,
195             "orderId": 60244727279620,
196             "payAmount": {
197                 "amount": 91.22,
198                 "cent": 9122,
199                 "currencyCode": "USD",
200                 "centFactor": 100,
201                 "currency": {
202                     "defaultFractionDigits": 2,
203                     "currencyCode": "USD",
204                     "symbol": "$"
205                 }
206             },
207             "gmtCreate": "20131005075313000-0700",
208             "orderStatus": "PLACE_ORDER_SUCCESS",
209             "buyerSignerFullname": "rahman agbaje",
210             "timeoutLeftTime": 1236418346,
211             "fundStatus": "NOT_PAY",
212             "bizType": "AE_COMMON"
213         }
214     ]
215 }
View Code

  解析的方式如下:

  1 /// 
  2         /// 获取速卖通订单列表Json
  3         /// 
  4         public int GetAliExpressOrdersJson(string page,string pageSize,string accessToken)
  5         {
  6             string result = "";
  7             //总记录
  8             int totalItem = -1;
  9             //获取订单时间,前两天
 10             DateTime startTime = DateTime.Now.AddDays(-2);
 11             //转换获取订单时间
 12             string dateStart = startTime.Month.ToString(CultureInfo.InvariantCulture) + "%2F" +
 13                                startTime.Day.ToString(CultureInfo.InvariantCulture) + "%2F" +
 14                                startTime.Year.ToString(CultureInfo.InvariantCulture);
 15             //获取订单前一天
 16             DateTime endTime = DateTime.Now.AddDays(-1);
 17             //转换获取订单时间
 18             string dateEnd = endTime.Month.ToString(CultureInfo.InvariantCulture) + "%2F" +
 19                                endTime.Day.ToString(CultureInfo.InvariantCulture) + "%2F" +
 20                                endTime.Year.ToString(CultureInfo.InvariantCulture);
 21 
 22             string AliOrderStatus = ConfigurationManager.AppSettings["OrderStatus"];
 23             //拼接请求的URL
 24             string urlPath = ConfigurationManager.AppSettings["FindOrderListQuery"] + "page=" + page + "&pageSize=" + pageSize + "&createDateStart=" + dateStart + "&createDateEnd=" + dateEnd + "&orderStatus=" + AliOrderStatus + "&access_token=" + accessToken;
 25             Logger.WriteLog("获取从" + startTime.ToShortDateString() + "" + endTime.ToShortDateString() + "之间订单的URL为:" + urlPath + "");
 26             Console.WriteLine("获取从" + startTime.ToShortDateString() + "" + endTime.ToShortDateString() + "之间订单的URL为:" + urlPath + "");
 27             WebRequest req = WebRequest.Create(urlPath);
 28             req.Method = "GET";
 29             WebResponse res = req.GetResponse();
 30             Stream receiveStream = res.GetResponseStream();
 31             Encoding encode = Encoding.GetEncoding("utf-8");
 32             StreamReader sr = new StreamReader(receiveStream, encode);
 33             char[] readbuffer = new char[20480];
 34             int n = sr.Read(readbuffer, 0, 20480);
 35             while (n > 0)
 36             {
 37                 string str = new string(readbuffer, 0, n);
 38                 result += str;
 39                 n = sr.Read(readbuffer, 0, 20480);
 40             }
 41             JavaScriptSerializer JSS = new JavaScriptSerializer();
 42             object obj = JSS.DeserializeObject(result);
 43             //获取Json对象,转换为键值对列表
 44             Dictionary<string, object> datajson = (Dictionary<string, object>)obj;
 45             //创建订单列表及订单明细列表
 46             var aliExpressOrderList = new List();
 47             var aliExpressOrderDetailList = new List();
 48             //解析键值对数据
 49             #region
 50             foreach (KeyValuePair<string, object> item in datajson)
 51             {
 52                 if (item.Key == "totalItem")
 53                 {
 54                     //订单总数
 55                     totalItem = Convert.ToInt32(item.Value.ToString());
 56                     Logger.WriteLog("获取从" + startTime.ToShortDateString() + "" + endTime.ToShortDateString() + "之间订单的总数为:" + totalItem + "");
 57                     Console.WriteLine("获取从" + startTime.ToShortDateString() + "" + endTime.ToShortDateString() + "之间订单的总数为:" + totalItem + "");
 58                 }
 59                 else
 60                 {
 61                     //获取orderList对象
 62                     object[] orderList = (object[])item.Value;
 63 
 64                     foreach (Dictionary<string, object> orders in orderList)
 65                     {
 66                         var aliExpressOrder = new AliExpressOrders();
 67                         #region
 68                         
 69                         //获取每一个Order
 70                         foreach (KeyValuePair<string, object> order in orders)
 71                         {
 72                             if (order.Key == "productList")
 73                             {
 74                                 object[] productList = (object[])order.Value;
 75                                 //获取子订单列表
 76                                 foreach (Dictionary<string, object> products in productList)
 77                                 {
 78                                     var aliExpressOderDetail = new AliExpressOrderDetails();
 79                                     //获取每一个子订单
 80                                     foreach (KeyValuePair<string, object> product in products)
 81                                     {
 82                                         if (product.Key == "childId")
 83                                         {
 84                                             string childId = product.Value.ToString();
 85                                             aliExpressOderDetail.childId = product.Value.ToString();
 86                                         }
 87                                         if (product.Key == "goodsPrepareTime")
 88                                         {
 89                                             string goodsPrepareTime = product.Value.ToString();
 90                                             aliExpressOderDetail.goodsPrepareTime = product.Value.ToString();
 91                                         }
 92                                         if (product.Key == "logisticsAmount")
 93                                         {
 94                                             Dictionary<string, object> logisticsAmountList = (Dictionary<string, object>)product.Value;
 95                                             foreach (var logisticsAmounts in logisticsAmountList)
 96                                             {
 97                                                 if (logisticsAmounts.Key == "amount")
 98                                                 {
 99                                                     string amount = logisticsAmounts.Value.ToString();
100                                                     aliExpressOderDetail.logisticsAmount = Convert.ToDecimal(logisticsAmounts.Value.ToString());
101                                                 }
102                                             }
103                                         }
104                                         if (product.Key == "memo")
105                                         {
106                                             string memo = product.Value.ToString();
107                                             aliExpressOderDetail.memo = product.Value.ToString();
108                                         }
109                                         if (product.Key == "totalProductAmount")
110                                         {
111                                             Dictionary<string, object> totalProductAmountList = (Dictionary<string, object>)product.Value;
112                                             foreach (var totalProductAmounts in totalProductAmountList)
113                                             {
114                                                 if (totalProductAmounts.Key == "amount")
115                                                 {
116                                                     string amount = totalProductAmounts.Value.ToString();
117                                                     aliExpressOderDetail.totalProductAmount = Convert.ToDecimal(totalProductAmounts.Value.ToString());
118                                                 }
119                                             }
120                                         }
121                                         if (product.Key == "freightCommitDay")
122                                         {
123                                             string freightCommitDay = product.Value.ToString();
124                                             aliExpressOderDetail.freightCommitDay = product.Value.ToString();
125                                         }
126                                         if (product.Key == "canSubmitIssue")
127                                         {
128                                             string canSubmitIssue = product.Value.ToString();
129                                             if (canSubmitIssue == "true")
130                                                 aliExpressOderDetail.canSubmitIssue = true;
131                                             aliExpressOderDetail.canSubmitIssue = false;
132                                         }
133                                         if (product.Key == "productUnit")
134                                         {
135                                             string productUnit = product.Value.ToString();
136                                             aliExpressOderDetail.productUnit = product.Value.ToString();
137                                         }
138                                         if (product.Key == "logisticsType")
139                                         {
140                                             string logisticsType = product.Value.ToString();
141                                             aliExpressOderDetail.logisticsType = product.Value.ToString();
142                                         }
143                                         if (product.Key == "issueStatus")
144                                         {
145                                             string issueStatus = product.Value.ToString();
146                                             aliExpressOderDetail.issueStatus = product.Value.ToString();
147                                         }
148                                         if (product.Key == "orderId")
149                                         {
150                                             string orderId = product.Value.ToString();
151                                             aliExpressOderDetail.OrderID = product.Value.ToString();
152                                         }
153                                         if (product.Key == "logisticsServiceName")
154                                         {
155                                             string logisticsServiceName = product.Value.ToString();
156                                             aliExpressOderDetail.logisticsServiceName = product.Value.ToString();
157                                         }
158                                         if (product.Key == "sonOrderStatus")
159                                         {
160                                             string sonOrderStatus = product.Value.ToString();
161                                             aliExpressOderDetail.sonOrderStatus = product.Value.ToString();
162                                         }
163                                         if (product.Key == "productSnapUrl")
164                                         {
165                                             string productSnapUrl = product.Value.ToString();
166                                             aliExpressOderDetail.productSnapUrl = product.Value.ToString();
167                                         }
168                                         if (product.Key == "moneyBack3x")
169                                         {
170                                             string moneyBack3x = product.Value.ToString();
171                                             if (moneyBack3x == "true")
172                                                 aliExpressOderDetail.moneyBack3x = true;
173                                             aliExpressOderDetail.moneyBack3x = false;
174                                         }
175                                         if (product.Key == "skuCode")
176                                         {
177                                             string skuCode = product.Value.ToString();
178                                             aliExpressOderDetail.skuCode = product.Value.ToString();
179                                         }
180                                         if (product.Key == "productId")
181                                         {
182                                             string productId = product.Value.ToString();
183                                             aliExpressOderDetail.productId = product.Value.ToString();
184                                         }
185                                         if (product.Key == "productCount")
186                                         {
187                                             string productCount = product.Value.ToString();
188                                             aliExpressOderDetail.productCount = Convert.ToInt32(product.Value.ToString());
189                                         }
190                                         if (product.Key == "deliveryTime")
191                                         {
192                                             string deliveryTime = product.Value.ToString();
193                                             aliExpressOderDetail.deliveryTime = product.Value.ToString();
194                                         }
195                                         if (product.Key == "productUnitPrice")
196                                         {
197                                             Dictionary<string, object> productUnitPriceList = (Dictionary<string, object>)product.Value;
198                                             foreach (var productUnitPrices in productUnitPriceList)
199                                             {
200                                                 if (productUnitPrices.Key == "amount")
201                                                 {
202                                                     string amount = productUnitPrices.Value.ToString();
203                                                     aliExpressOderDetail.productUnitPrice = Convert.ToDecimal(productUnitPrices.Value.ToString());
204                                                 }
205                                             }
206                                         }
207                                         if (product.Key == "productImgUrl")
208                                         {
209                                             string productImgUrl = product.Value.ToString();
210                                             aliExpressOderDetail.productImgUrl = product.Value.ToString();
211                                         }
212                                         if (product.Key == "showStatus")
213                                         {
214                                             string showStatus = product.Value.ToString();
215                                         }
216                                         if (product.Key == "productName")
217                                         {
218                                             string productName = product.Value.ToString();
219                                             aliExpressOderDetail.productName = product.Value.ToString();
220                                         }
221 
222                                     }
223                                     aliExpressOrderDetailList.Add(aliExpressOderDetail);
224                                 }
225                             }
226                             if (order.Key == "issueStatus")
227                             {
228                                 string issueStatus = order.Value.ToString();
229                                 aliExpressOrder.issueStatus = order.Value.ToString();
230                             }
231                             if (order.Key == "frozenStatus")
232                             {
233                                 string frozenStatus = order.Value.ToString();
234                                 aliExpressOrder.frozenStatus = order.Value.ToString();
235                             }
236                             if (order.Key == "buyerLoginId")
237                             {
238                                 string buyerLoginId = order.Value.ToString();
239                                 aliExpressOrder.buyerLoginId = order.Value.ToString();
240                             }
241                             if (order.Key == "sellerSignerFullname")
242                             {
243                                 string sellerSignerFullname = order.Value.ToString();
244                                 aliExpressOrder.sellerSignerFullname = order.Value.ToString();
245                             }
246                             if (order.Key == "orderId")
247                             {
248                                 string orderId = order.Value.ToString();
249                                 aliExpressOrder.orderId = order.Value.ToString();
250                             }
251                             if (order.Key == "payAmount")
252                             {
253                                 Dictionary<string, object> payAmountList = (Dictionary<string, object>)order.Value;
254                                 foreach (var payAmounts in payAmountList)
255                                 {
256                                     if (payAmounts.Key == "amount")
257                                     {
258                                         string amount = payAmounts.Value.ToString();
259                                         aliExpressOrder.payAmount = Convert.ToDecimal(payAmounts.Value.ToString());
260                                     }
261                                 }
262                             }
263                             if (order.Key == "gmtCreate")
264                             {
265                                 string gmtCreate = order.Value.ToString();
266                                 aliExpressOrder.gmtCreate = order.Value.ToString();
267                             }
268                             if (order.Key == "orderStatus")
269                             {
270                                 string orderStatus = order.Value.ToString();
271                                 aliExpressOrder.orderStatus = order.Value.ToString();
272                             }
273                             if (order.Key == "buyerSignerFullname")
274                             {
275                                 string buyerSignerFullname = order.Value.ToString();
276                                 aliExpressOrder.buyerSignerFullname = order.Value.ToString();
277                             }
278                             if (order.Key == "timeoutLeftTime")
279                             {
280                                 string timeoutLeftTime = order.Value.ToString();
281                                 aliExpressOrder.timeoutLeftTime = order.Value.ToString();
282                             }
283                             if (order.Key == "fundStatus")
284                             {
285                                 string fundStatus = order.Value.ToString();
286                                 aliExpressOrder.fundStatus = order.Value.ToString();
287                             }
288                             if (order.Key == "bizType")
289                             {
290                                 string bizType = order.Value.ToString();
291                                 aliExpressOrder.bizType = order.Value.ToString();
292                             }
293                         }
294                         #endregion
295                         aliExpressOrderList.Add(aliExpressOrder);
296                     }
297                 }
298                 new AliExpressService().AddAliExpressOdersAndDetails(aliExpressOrderList, aliExpressOrderDetailList);
299             }
300             #endregion
301 
302             foreach (var orderse in aliExpressOrderList)
303             {
304                 GetAliExpressOrdersDetailJson(orderse.orderId, accessToken);
305             }
306 
307             return totalItem;
308         }
View Code

  个人感觉这种解析方式还是比较繁琐的。不知园子里的大牛们,是否能提供一种比较简便的解析Json的方式。

  

转载于:https://www.cnblogs.com/teikey/p/teikey.html

你可能感兴趣的:(c# 通过访问URL,获取并解析远程服务端返回的复杂Json数据)