2015-01-02 3 views
-1

Вопрос фон:Преобразование большого потока httpresponse в строку JSON?

Update:

Я все еще не уверен, как идти об извлечении соответствующей информации из этого ответа. Я попытался установить свой тип ответа на JSON, но все равно получаю ответ, как показано ниже. Я принял во внимание то, что было сказано в отношении использования NameValueCollection, но все еще не видно, как это поможет с таким большим ответом. В идеале я бы хотел, чтобы это отображалось в какой-либо объектной структуре, но не обязательно должно быть JSON.

Вопрос:

Я в настоящее время с помощью метода, PayPal Api «ExpressCheckout», чтобы позволить пользователям платить за предметы на моем тестовом сайте. Ответ HTTP из API обеспечивает большой ответ, содержащий ключевую информацию, мне нужно извлечь - такие, как обращаться покупатели, если платеж был успешным и т.д.

Этот вопрос:

В настоящее время I» 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) для удаления всех кодов HTML в строке« rawResponse ». Я дам вам 50 очков за 8 часов, когда мне разрешат. Еще раз спасибо! – 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" 

Update:

Это ответ строка, которая обрабатывается здесь и не просить, следовательно, вы не сможете получить детали с помощью 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

Смежные вопросы