2012-07-10 67 views
-2

我使用貝寶NVP和NVP在鍵值對串做出響應反序列化鍵值串

TOKEN = EC-3XXXXXXXXXXX154J & BILLINGAGREEMENTACCEPTEDSTATUS = 1 & CHECKOUTSTATUS = PaymentActionNotInitiated & TIMESTAMP = 2012 -07-10T11:45:59Z &的correlationID = ecf9bfe9b1168 & ACK =成功& VERSION = 64.0 & BUILD = 3242673 & [email protected] & PAYERID = 3V85HKW32SXKG & PAYERSTATUS =驗證& FIRSTNAME =戈文德& LASTNAME =馬爾維亞& COUNTRYCODE = US & SHIPTONAME =戈文德 馬爾維亞& SHIPTOSTREET = 1 MAIN ST & SHIPTOCITY =聖 聖何塞& SHIPTOSTATE = CA & SHIPTOZIP = 95131 & SHIPTOCOUNTRYCODE = US & SHIPTOCOUNTRYNAME =美國 美國& ADDRESSSTATUS =確認& CURRENCYCODE = USD & AMT = 30.90 & SHIPPINGAMT = 0.00 & HANDLINGAMT = 0.00 & TAXAMT = 0.00 & DESC =測試EC 付款& INSURANCEAMT = 0.00 & SHIPDISCAMT = 0.00 & PAYMENTREQUEST_0_CURRENCYCODE = USD & PAYMENTREQUEST_0_AMT = 30.90 & PAYMENTREQUEST_0_SHIPPINGAMT = 0.00 & PAYMENTREQUEST_0_HANDLINGAMT = 0.00 & PAYMENTREQUEST_0_TAXAMT = 0.00 & PAYMENTREQUEST_0_DESC =測試 EC 付款& PAYMENTREQUEST_0_INSURANCEAMT = 0.00 & PAYMENTREQUEST_0_SHIPDISCAMT = 0.00 & PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED = false & PAYMENTREQUEST_0_SHIPTONAME = Govind Malviya & PAYMENTREQUEST_0_SHIPTOSTREET = 1主 聖& PAYMENTREQUEST_0_SHIPTOCITY =聖 聖何塞& PAYMENTREQUEST_0_SHIPTOSTATE = CA & PAYMENTREQUEST_0_SHIPTOZIP = 95131 & PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE = US & PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME =美國 美國& PAYMENTREQUESTINFO_0_ERRORCODE = 0

我想desrialize它的強類型數據,就像JavaScriptSerializer爲json字符串做的一樣。請不要使用字典提供解決方案我想避免魔術字符串,我可以在每個屬性上添加屬性。

我的班級

public class GetExpressCheckoutDetailsResponse : IPaypalResponse 
    { 
     public string Token { get; set; } 
     public string BillingAgreementAcceptedStatus { get; set; } 
     public string CheckoutStatus { get; set; } 
     public string Timestamp { get; set; } 
     public string CorrelationID { get; set; } 
     public Status Acknowledgement { get; set; } 
     public string Version { get; set; } 
     public string Build { get; set; } 
     public string Email { get; set; } 
     public string PayerID { get; set; } 
     public string PayerStatus { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string CountryCode { get; set; } 
     public string ShiptoName { get; set; } 
     public string ShiptoStreet { get; set; } 
     public string ShipToCity { get; set; } 
     public string ShipToState { get; set; } 
     public string ShipToZip { get; set; } 
     public string ShipToCountryCode { get; set; } 
     public string ShipToCountryName { get; set; } 
     public string AddressStatus { get; set; } 
     public string CurrencyCode { get; set; } 
     public string Amount { get; set; } 
     public string ShippingAmount { get; set; } 
     public string HandlingAmount { get; set; } 
     public string TaxAmount { get; set; } 
     public string Description { get; set; } 
     public string InsuranceAmount { get; set; } 
     public string ShipdiscAmount { get; set; } 
     public string PaymentRequestCurrencycode { get; set; } 
     public string PaymentRequestAmount { get; set; } 
     public string PaymentRequestShippingAmount { get; set; } 
     public string PaymentRequestHandlingAmount { get; set; } 
     public string PaymentRequestTaxAmount { get; set; } 
     public string PaymentRequestDescription { get; set; } 
     public string PaymentRequestInsuranceAmount { get; set; } 
     public string PaymentRequestShipdiscAmount { get; set; } 
     public string PaymentRequestInsuranceOptionOffered { get; set; } 
     public string PaymentRequestShipToName { get; set; } 
     public string PaymentRequestShipToStreet { get; set; } 
     public string PaymentRequestShipToCity { get; set; } 
     public string PaymentRequestShipToState { get; set; } 
     public string PaymentRequestShipToZip { get; set; } 
     public string PaymentRequestShipToCountryCode { get; set; } 
     public string PaymentRequestShipToCountryName { get; set; } 
     public string PaymentRequestInfoErrorCode { get; set; } 
    } 
+2

你有什麼關於使用反射?我懷疑有一個隨時可以使用的序列化器來做你想做的事情。 – 2012-07-10 12:37:58

+0

思考和屬性聽起來不錯 – 2012-07-10 12:43:15

+0

@Codeleuth我想可能會有很多不同的迴應,但反映_single_固定類似乎對我來說也是過分的。 – 2012-07-10 12:44:32

回答

2

您可以使用HttpUtility.ParseQueryString將您的字符串轉換爲NameValueCollection。其餘的只是reflection

string responseString = "TOKEN=EC......"; 
var dict = HttpUtility.ParseQueryString(responseString); 
GetExpressCheckoutDetailsResponse respObj = new GetExpressCheckoutDetailsResponse(); 
foreach (var p in respObj.GetType().GetProperties()) 
{ 
    p.SetValue(respObj, dict[p.Name]); 
} 

//respObj is ready to use 
+0

我唯一要說的就是,你只是爲了一個小的解析函數而增加了對'System.Web'的依賴,對我來說似乎有點OTT(除非OP已經使用'System .Web')。 – James 2012-07-11 10:57:10

1

所以,因爲沒有現成的使用deserializator對於您的問題,您應該做到以下幾點:

  1. 屬性添加到每個代表的財產貝寶的迴應「。
  2. 反映類實例的屬性並將它們緩存到Dictionary<string, PropertyInfo>,其中字符串是屬性的值。
  3. 通過"some string".Split(..)在PayPal響應中迭代方法的結果,收集字符串和值,然後將它們存儲到您應該在字典中查找的相應屬性中。
+0

非常感謝你的回答!我解決了我的問題。 – 2012-07-10 13:15:34

+0

@GovindKamalaPrakashMalviya不要忘記接受答案。 – AgentFire 2012-07-10 13:22:47

3

您可以使用LINQ將數據提取到Dictionary<TKey, TValue>,然後您可以使用它來映射班級中的數據,例如

var paypalResponse = "..."; 
var data = paypalResponse.Split('&') 
         .Select(x => x.Split('=')) 
         .ToDictionary(x => x[0], x => x[1]); 

然後,您可以通過這個到您的GetExpressCheckoutDetailsResponse類的構造函數,甚至爲此它裏面例如

public class GetExpressCheckoutDetailsResponse : IPaypalResponse 
{ 
    public GetExpressCheckoutDetailsResponse(Dictionary<string, string> data) 
    { 
     this.Token = data["TOKEN"]; 
     this.BillingAgreementAcceptedStatus = data["BILLINGAGREEMENTACCEPTEDSTATUS"]; 
     ... 
    } 
} 

使用這樣的事情,不值得爲你的屬性不完全匹配,所以你需要添加元數據屬性每個屬性的可能是更多的麻煩反思。

+0

非常感謝您的回答!我解決了我的問題。 – 2012-07-10 13:16:02

+1

@GovindKamalaPrakashMalviya查看你的答案,你使用了你提供的解決方案,但將映射部分換出。所以*我們*解決了你的問題。您應該始終標記爲您提供最大幫助的答案(即使這不是完整的解決方案)。 – James 2012-07-10 13:31:31

+0

我還沒有接受任何答案,你怎麼能告訴這個?感謝downvote。 – 2012-07-10 13:54:13

0

在你的具體情況,而不是重新發明輪子;您如何使用PayPal SDK?

http://paypal.github.io/sdk/

你想要的是Express Checkout SDK for C#

它已經需要用正確的數據類型的所有字段,它具有自動響應的所有通話/分析的好處在幾個簡單的函數調用之後。

手動構建自己的API調用並解析響應不是最好的方法。當然,最終你會得到它的工作,但直到你這樣做,這將是一個耗時和容易出錯的過程...

+0

這兩個鏈接都已損壞。你能否更新他們? – 2014-08-03 15:29:10

+0

更新了鏈接。 – 2014-08-04 23:57:06