您的位置:首页 > Web前端 > JavaScript

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

2013-10-17 12:00 821 查看
  最近在做一个业务需求,需要通过速卖通提供的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格式如下:

  

/// <summary>
/// 获取速卖通订单列表Json
/// </summary>
public int GetAliExpressOrdersJson(string page,string pageSize,string accessToken)
{
string result = "";
//总记录
int totalItem = -1;
//获取订单时间,前两天
DateTime startTime = DateTime.Now.AddDays(-2);
//转换获取订单时间
string dateStart = startTime.Month.ToString(CultureInfo.InvariantCulture) + "%2F" +
startTime.Day.ToString(CultureInfo.InvariantCulture) + "%2F" +
startTime.Year.ToString(CultureInfo.InvariantCulture);
//获取订单前一天
DateTime endTime = DateTime.Now.AddDays(-1);
//转换获取订单时间
string dateEnd = endTime.Month.ToString(CultureInfo.InvariantCulture) + "%2F" +
endTime.Day.ToString(CultureInfo.InvariantCulture) + "%2F" +
endTime.Year.ToString(CultureInfo.InvariantCulture);

string AliOrderStatus = ConfigurationManager.AppSettings["OrderStatus"];
//拼接请求的URL
string urlPath = ConfigurationManager.AppSettings["FindOrderListQuery"] + "page=" + page + "&pageSize=" + pageSize + "&createDateStart=" + dateStart + "&createDateEnd=" + dateEnd + "&orderStatus=" + AliOrderStatus + "&access_token=" + accessToken;
Logger.WriteLog("获取从" + startTime.ToShortDateString() + "到" + endTime.ToShortDateString() + "之间订单的URL为:" + urlPath + "。");
Console.WriteLine("获取从" + startTime.ToShortDateString() + "到" + endTime.ToShortDateString() + "之间订单的URL为:" + urlPath + "。");
WebRequest req = WebRequest.Create(urlPath);
req.Method = "GET";
WebResponse res = req.GetResponse();
Stream receiveStream = res.GetResponseStream();
Encoding encode = Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader(receiveStream, encode);
char[] readbuffer = new char[20480];
int n = sr.Read(readbuffer, 0, 20480);
while (n > 0)
{
string str = new string(readbuffer, 0, n);
result += str;
n = sr.Read(readbuffer, 0, 20480);
}
JavaScriptSerializer JSS = new JavaScriptSerializer();
object obj = JSS.DeserializeObject(result);
//获取Json对象,转换为键值对列表
Dictionary<string, object> datajson = (Dictionary<string, object>)obj;
//创建订单列表及订单明细列表
var aliExpressOrderList = new List<AliExpressOrders>();
var aliExpressOrderDetailList = new List<AliExpressOrderDetails>();
//解析键值对数据
#region
foreach (KeyValuePair<string, object> item in datajson)
{
if (item.Key == "totalItem")
{
//订单总数
totalItem = Convert.ToInt32(item.Value.ToString());
Logger.WriteLog("获取从" + startTime.ToShortDateString() + "到" + endTime.ToShortDateString() + "之间订单的总数为:" + totalItem + "。");
Console.WriteLine("获取从" + startTime.ToShortDateString() + "到" + endTime.ToShortDateString() + "之间订单的总数为:" + totalItem + "。");
}
else
{
//获取orderList对象
object[] orderList = (object[])item.Value;

foreach (Dictionary<string, object> orders in orderList)
{
var aliExpressOrder = new AliExpressOrders();
#region

//获取每一个Order
foreach (KeyValuePair<string, object> order in orders)
{
if (order.Key == "productList")
{
object[] productList = (object[])order.Value;
//获取子订单列表
foreach (Dictionary<string, object> products in productList)
{
var aliExpressOderDetail = new AliExpressOrderDetails();
//获取每一个子订单
foreach (KeyValuePair<string, object> product in products)
{
if (product.Key == "childId")
{
string childId = product.Value.ToString();
aliExpressOderDetail.childId = product.Value.ToString();
}
if (product.Key == "goodsPrepareTime")
{
string goodsPrepareTime = product.Value.ToString();
aliExpressOderDetail.goodsPrepareTime = product.Value.ToString();
}
if (product.Key == "logisticsAmount")
{
Dictionary<string, object> logisticsAmountList = (Dictionary<string, object>)product.Value;
foreach (var logisticsAmounts in logisticsAmountList)
{
if (logisticsAmounts.Key == "amount")
{
string amount = logisticsAmounts.Value.ToString();
aliExpressOderDetail.logisticsAmount = Convert.ToDecimal(logisticsAmounts.Value.ToString());
}
}
}
if (product.Key == "memo")
{
string memo = product.Value.ToString();
aliExpressOderDetail.memo = product.Value.ToString();
}
if (product.Key == "totalProductAmount")
{
Dictionary<string, object> totalProductAmountList = (Dictionary<string, object>)product.Value;
foreach (var totalProductAmounts in totalProductAmountList)
{
if (totalProductAmounts.Key == "amount")
{
string amount = totalProductAmounts.Value.ToString();
aliExpressOderDetail.totalProductAmount = Convert.ToDecimal(totalProductAmounts.Value.ToString());
}
}
}
if (product.Key == "freightCommitDay")
{
string freightCommitDay = product.Value.ToString();
aliExpressOderDetail.freightCommitDay = product.Value.ToString();
}
if (product.Key == "canSubmitIssue")
{
string canSubmitIssue = product.Value.ToString();
if (canSubmitIssue == "true")
aliExpressOderDetail.canSubmitIssue = true;
aliExpressOderDetail.canSubmitIssue = false;
}
if (product.Key == "productUnit")
{
string productUnit = product.Value.ToString();
aliExpressOderDetail.productUnit = product.Value.ToString();
}
if (product.Key == "logisticsType")
{
string logisticsType = product.Value.ToString();
aliExpressOderDetail.logisticsType = product.Value.ToString();
}
if (product.Key == "issueStatus")
{
string issueStatus = product.Value.ToString();
aliExpressOderDetail.issueStatus = product.Value.ToString();
}
if (product.Key == "orderId")
{
string orderId = product.Value.ToString();
aliExpressOderDetail.OrderID = product.Value.ToString();
}
if (product.Key == "logisticsServiceName")
{
string logisticsServiceName = product.Value.ToString();
aliExpressOderDetail.logisticsServiceName = product.Value.ToString();
}
if (product.Key == "sonOrderStatus")
{
string sonOrderStatus = product.Value.ToString();
aliExpressOderDetail.sonOrderStatus = product.Value.ToString();
}
if (product.Key == "productSnapUrl")
{
string productSnapUrl = product.Value.ToString();
aliExpressOderDetail.productSnapUrl = product.Value.ToString();
}
if (product.Key == "moneyBack3x")
{
string moneyBack3x = product.Value.ToString();
if (moneyBack3x == "true")
aliExpressOderDetail.moneyBack3x = true;
aliExpressOderDetail.moneyBack3x = false;
}
if (product.Key == "skuCode")
{
string skuCode = product.Value.ToString();
aliExpressOderDetail.skuCode = product.Value.ToString();
}
if (product.Key == "productId")
{
string productId = product.Value.ToString();
aliExpressOderDetail.productId = product.Value.ToString();
}
if (product.Key == "productCount")
{
string productCount = product.Value.ToString();
aliExpressOderDetail.productCount = Convert.ToInt32(product.Value.ToString());
}
if (product.Key == "deliveryTime")
{
string deliveryTime = product.Value.ToString();
aliExpressOderDetail.deliveryTime = product.Value.ToString();
}
if (product.Key == "productUnitPrice")
{
Dictionary<string, object> productUnitPriceList = (Dictionary<string, object>)product.Value;
foreach (var productUnitPrices in productUnitPriceList)
{
if (productUnitPrices.Key == "amount")
{
string amount = productUnitPrices.Value.ToString();
aliExpressOderDetail.productUnitPrice = Convert.ToDecimal(productUnitPrices.Value.ToString());
}
}
}
if (product.Key == "productImgUrl")
{
string productImgUrl = product.Value.ToString();
aliExpressOderDetail.productImgUrl = product.Value.ToString();
}
if (product.Key == "showStatus")
{
string showStatus = product.Value.ToString();
}
if (product.Key == "productName")
{
string productName = product.Value.ToString();
aliExpressOderDetail.productName = product.Value.ToString();
}

}
aliExpressOrderDetailList.Add(aliExpressOderDetail);
}
}
if (order.Key == "issueStatus")
{
string issueStatus = order.Value.ToString();
aliExpressOrder.issueStatus = order.Value.ToString();
}
if (order.Key == "frozenStatus")
{
string frozenStatus = order.Value.ToString();
aliExpressOrder.frozenStatus = order.Value.ToString();
}
if (order.Key == "buyerLoginId")
{
string buyerLoginId = order.Value.ToString();
aliExpressOrder.buyerLoginId = order.Value.ToString();
}
if (order.Key == "sellerSignerFullname")
{
string sellerSignerFullname = order.Value.ToString();
aliExpressOrder.sellerSignerFullname = order.Value.ToString();
}
if (order.Key == "orderId")
{
string orderId = order.Value.ToString();
aliExpressOrder.orderId = order.Value.ToString();
}
if (order.Key == "payAmount")
{
Dictionary<string, object> payAmountList = (Dictionary<string, object>)order.Value;
foreach (var payAmounts in payAmountList)
{
if (payAmounts.Key == "amount")
{
string amount = payAmounts.Value.ToString();
aliExpressOrder.payAmount = Convert.ToDecimal(payAmounts.Value.ToString());
}
}
}
if (order.Key == "gmtCreate")
{
string gmtCreate = order.Value.ToString();
aliExpressOrder.gmtCreate = order.Value.ToString();
}
if (order.Key == "orderStatus")
{
string orderStatus = order.Value.ToString();
aliExpressOrder.orderStatus = order.Value.ToString();
}
if (order.Key == "buyerSignerFullname")
{
string buyerSignerFullname = order.Value.ToString();
aliExpressOrder.buyerSignerFullname = order.Value.ToString();
}
if (order.Key == "timeoutLeftTime")
{
string timeoutLeftTime = order.Value.ToString();
aliExpressOrder.timeoutLeftTime = order.Value.ToString();
}
if (order.Key == "fundStatus")
{
string fundStatus = order.Value.ToString();
aliExpressOrder.fundStatus = order.Value.ToString();
}
if (order.Key == "bizType")
{
string bizType = order.Value.ToString();
aliExpressOrder.bizType = order.Value.ToString();
}
}
#endregion
aliExpressOrderList.Add(aliExpressOrder);
}
}
new AliExpressService().AddAliExpressOdersAndDetails(aliExpressOrderList, aliExpressOrderDetailList);
}
#endregion

foreach (var orderse in aliExpressOrderList)
{
GetAliExpressOrdersDetailJson(orderse.orderId, accessToken);
}

return totalItem;
}


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

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐