2015-01-02 30 views
-1

问题背景:将大的httpresponse流转换为JSON字符串?

更新:

我仍然不知道如何去提取这个响应的相关信息。我曾尝试将我的响应类型设置为JSON,但仍然收到如下所示的响应。我已经考虑了关于使用NameValueCollection的说法,但仍不能看出这将如何帮助实现如此大的响应。理想情况下,我希望将其映射到某种对象结构,它不一定是JSON。

问:

我目前使用PayPal的API“ExpressCheckout”的方法,以允许用户需要为我的测试站点中的项目。从API HTTP响应提供包含关键信息,我需要提取大量的反应 - 如买家地址,付款是否成功的等

的问题

目前我m停留在如何处理响应。理想情况下,我会将数据转换为JSON字符串,然后使用Newtonsoft将数据映射到C#类,从而允许轻松访问数据。这里是的HttpResponse的例子:

TOKEN=EC%2XXXXXXXXXXXXXXXXXR&BILLINGAGREEMENTACCEPTEDSTATUS=0&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2015%2d01%2d02T21%3a11%3a30Z&CORRELATIONID=ab184fdba7a30&ACK=Success&VERSION=88%2e0&BUILD=14443165&EMAIL=test%40aol%2ecom&PAYERID=3XXXXXXXXXX4N&PAYERSTATUS=verified&BUSINESS=Test%20Biz%27s%20Test%20Store&FIRSTNAME=Joe&LASTNAME=King&COUNTRYCODE=GB&SHIPTONAME=Joe%20King%27s%20Test%20Store&SHIPTOSTREET=1%20Main%20Terrace&SHIPTOCITY=Wolverhampton&SHIPTOSTATE=West%20Midlands&SHIPTOZIP=W12%204LQ&SHIPTOCOUNTRYCODE=GB&SHIPTOCOUNTRYNAME=United%20Kingdom&ADDRESSSTATUS=Confirmed&CURRENCYCODE=GBP&AMT=15%2e56&ITEMAMT=15%2e56&SHIPPINGAMT=0%2e00&HANDLINGAMT=0%2e00&TAXAMT=0%2e00&INSURANCEAMT=0%2e00&SHIPDISCAMT=0%2e00&L_NAME0=ItemOne&L_QTY0=4&L_TAXAMT0=0%2e00&L_AMT0=3%2e89&L_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_ITEMHEIGHTVALUE0=%20%20%200%2e00000&PAYMENTREQUEST_0_CURRENCYCODE=GBP&PAYMENTREQUEST_0_AMT=15%2e56&PAYMENTREQUEST_0_ITEMAMT=15%2e56&PAYMENTREQUEST_0_SHIPPINGAMT=0%2e00&PAYMENTREQUEST_0_HANDLINGAMT=0%2e00&PAYMENTREQUEST_0_TAXAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEAMT=0%2e00&PAYMENTREQUEST_0_SHIPDISCAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED=false&PAYMENTREQUEST_0_SHIPTONAME=Joe%20King%27s%20Test%20Store&PAYMENTREQUEST_0_SHIPTOSTREET=1%20Main%20Terrace&PAYMENTREQUEST_0_SHIPTOCITY=Wolverhampton&PAYMENTREQUEST_0_SHIPTOSTATE=West%20Midlands&PAYMENTREQUEST_0_SHIPTOZIP=W12%204LQ&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=GB&PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME=United%20Kingdom&PAYMENTREQUEST_0_ADDRESSSTATUS=Confirmed&L_PAYMENTREQUEST_0_NAME0=ItemOne&L_PAYMENTREQUEST_0_QTY0=4&L_PAYMENTREQUEST_0_TAXAMT0=0%2e00&L_PAYMENTREQUEST_0_AMT0=3%2e89&L_PAYMENTREQUEST_0_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMHEIGHTVALUE0=%20%20%200%2e00000&PAYMENTREQUESTINFO_0_ERRORCODE=0 

如果任何人都可以给我一个简单的方法来映射这个数据到C#对象将是巨大的。

+0

为了能够使用Json.Net将响应转换为模型,您需要使用paypal将Json发送给您。你发布的不是Json,所以你需要手动解析。 – zaitsman

+0

这是来自服务器端的呼叫吗?你可以参考:http:// stackoverflow。com/questions/11129286/get-json-from-httpresponse – cjsmith

+1

把它作为一个NameValueCollection来映射(为什么“额外的”JSON转换是“理想的”)? – EdSF

回答

2

是否有任何特定的原因,你为什么要在JSON格式?如果没有要求,并且您可以使用键值对,那么您可以通过这种方式将响应处理为键值对。

public partial class Form1 : Form 
{ 
    Dictionary<string, string> processedResponse = null; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string rawResponse = "TOKEN=EC%2XXXXXXXXXXXXXXXXXR&BILLINGAGREEMENTACCEPTEDSTATUS=0&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2015%2d01%2d02T21%3a11%3a30Z&CORRELATIONID=ab184fdba7a30&ACK=Success&VERSION=88%2e0&BUILD=14443165&EMAIL=test%40aol%2ecom&PAYERID=3XXXXXXXXXX4N&PAYERSTATUS=verified&BUSINESS=Test%20Biz%27s%20Test%20Store&FIRSTNAME=Joe&LASTNAME=King&COUNTRYCODE=GB&SHIPTONAME=Joe%20King%27s%20Test%20Store&SHIPTOSTREET=1%20Main%20Terrace&SHIPTOCITY=Wolverhampton&SHIPTOSTATE=West%20Midlands&SHIPTOZIP=W12%204LQ&SHIPTOCOUNTRYCODE=GB&SHIPTOCOUNTRYNAME=United%20Kingdom&ADDRESSSTATUS=Confirmed&CURRENCYCODE=GBP&AMT=15%2e56&ITEMAMT=15%2e56&SHIPPINGAMT=0%2e00&HANDLINGAMT=0%2e00&TAXAMT=0%2e00&INSURANCEAMT=0%2e00&SHIPDISCAMT=0%2e00&L_NAME0=ItemOne&L_QTY0=4&L_TAXAMT0=0%2e00&L_AMT0=3%2e89&L_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_ITEMHEIGHTVALUE0=%20%20%200%2e00000&PAYMENTREQUEST_0_CURRENCYCODE=GBP&PAYMENTREQUEST_0_AMT=15%2e56&PAYMENTREQUEST_0_ITEMAMT=15%2e56&PAYMENTREQUEST_0_SHIPPINGAMT=0%2e00&PAYMENTREQUEST_0_HANDLINGAMT=0%2e00&PAYMENTREQUEST_0_TAXAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEAMT=0%2e00&PAYMENTREQUEST_0_SHIPDISCAMT=0%2e00&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED=false&PAYMENTREQUEST_0_SHIPTONAME=Joe%20King%27s%20Test%20Store&PAYMENTREQUEST_0_SHIPTOSTREET=1%20Main%20Terrace&PAYMENTREQUEST_0_SHIPTOCITY=Wolverhampton&PAYMENTREQUEST_0_SHIPTOSTATE=West%20Midlands&PAYMENTREQUEST_0_SHIPTOZIP=W12%204LQ&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=GB&PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME=United%20Kingdom&PAYMENTREQUEST_0_ADDRESSSTATUS=Confirmed&L_PAYMENTREQUEST_0_NAME0=ItemOne&L_PAYMENTREQUEST_0_QTY0=4&L_PAYMENTREQUEST_0_TAXAMT0=0%2e00&L_PAYMENTREQUEST_0_AMT0=3%2e89&L_PAYMENTREQUEST_0_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMHEIGHTVALUE0=%20%20%200%2e00000&PAYMENTREQUESTINFO_0_ERRORCODE=0"; 
     //Process response 
     processedResponse = ProcessResponse(rawResponse); 

     //Use received data e.g. 

     //Get First name 
     string fName = GetRecordValue("FIRSTNAME"); 

     //Get Last name 
     string lName = GetRecordValue("LASTNAME"); 
    } 

    private Dictionary<string,string> ProcessResponse(string response) 
    { 
     Dictionary<string, string> responseData = new Dictionary<string, string>(); 

     if(!string.IsNullOrWhiteSpace(response)) 
     { 
      string[] firstPass = response.Split(new char[] { '&' }); 
      foreach(string pair in firstPass) 
      { 
       string[] secondPass = pair.Split(new char[] { '=' }); 
       if(secondPass!=null && secondPass.Length>0) 
       { 
        responseData.Add(secondPass[0].Trim(), secondPass[1].Trim()); 
       } 
      } 
     } 
     return responseData; 
    } 

    private string GetRecordValue(string record) 
    { 
     string recordValue = null; 
     if(processedResponse!=null) 
     { 
      if(!string.IsNullOrWhiteSpace(record) && processedResponse.ContainsKey(record)) 
      { 
       recordValue= processedResponse[record]; 
      } 
     } 
     return recordValue; 
    } 
} 
+0

这是一个很好的答案,谢谢。我现在有一个可以使用的填充NameValueCollection。我添加到答案中的唯一项目是使用'HttpUtility.UrlDecode(rawResponse)来删除'rawResponse'字符串上的所有HTML代码。当我获准的时候,我会在8小时内给你50分的奖励。再次谢谢你! – user1352057

1

仍然不确定有什么用它处理为NameValueCollection问题。

E.g.

//NameValueCollection 
//or use HttpUtility.ParseQueryString(some_string_of_names_values) 
var foo = Request.QueryString; 

var bar = foo["FIRSTNAME"]; //based on above this is "Joe" 

更新:

这是正在这里进行处理,而不是索取,因此您将无法使用的Request.QueryString

检索细节如前所述响应字符串在评论中:

string rawResponse = "TOKEN=EC%2XXXXXXXXXXXXXXXXXR&BILLINGAGREEMENTACCEPTEDSTATUS=0&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2015%2d01%2d02T21%3a11%3a30Z&CORRELATIONID=ab184fdba7a30&ACK=Success&VERSION=88...." 

var foo = HttpUtility.ParseQueryString(rawResponse); //NameValueCollection 
var bar = foo["FIRSTNAME"]; //Joe 
+0

它是在这里处理的响应字符串,而不是请求,因此您无法使用Request.QueryString检索详细信息。 –

+0

@PankajKapare不会更改任何内容,请参阅更新的答案 – EdSF