2013-06-12 51 views
0

如果有幫助,我使用CampBX API在我的賬戶中獲得資金。我寫了下面的代碼使API調用:解析C#中的JSON響應#

using (var wb = new WebClient()) 
     { 
      String url = "https://CampBX.com/api/myfunds.php"; 

      var data = new NameValueCollection(); 
      data["user"] = "USERNAME"; 
      data["pass"] = "PASSWORD"; 
      var response = wb.UploadValues(url, "POST", data); 
     } 

WebClient.UploadValues()返回byte[],我不知道如何正確地分析。

Here is the CampBX info, under Account Balances

回答

1

簡而言之,您需要使用JSON解析器。我個人喜歡Newtonsoft.Json,這是我將在這個例子中使用。

第一步是將byte[]轉換爲字符序列,字符串對象或TextReader。第二步是將這些信息傳遞給解析器。所以,在你的情況下,代碼會是這個樣子:

JToken parsedToken; 
using (var responseReader = new StreamReader(new MemoryStream(response))) { 
    parsedToken = JToken.ReadFrom(responseReader); 
} 

parsedToken對象可以被用來提取您需要的任何數據。 (有關從JToken對象中提取數據的信息,請參閱the documentation。)

請注意,WebClient.UploadValues()丟棄有關響應實體字符編碼的信息。 StreamReader默認使用UTF-8編碼,這足以解析UTF-8或ASCII。根據服務器使用的JSON編碼器,響應可能始終是ASCII兼容的,因此您可能不必擔心。不過,這是你應該調查的東西。

0

DataContractJsonSerializer內置對象將在這裏成爲您的朋友,前提是您知道返回對象的內部結構是什麼(或者至少可以從JSON中猜出它)。

的步驟是: 定義一個合同類來保存反序列化JSON對象

namespace AppNameSpace 
{ 
    [DataContract]    /* Place this inside your app namespace */ 
    internal class iResponse /*Name this class appropriately */ 
    { 
     [DataMember] 
     internal string field1; 
     [DataMember] 
     internal string field2; 
     [DataMember] 
     internal Int32 field3; 
    } 
    ... 
} 

實際解析本身爲約三行

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(iOpenParams)); 
MemoryStream stream1 = new MemoryStream(response); 
iResponse resp_json = (iResponse)ser.ReadObject(stream1); 

詳情和實施例,請參閱: http://msdn.microsoft.com/en-us/library/bb412179.aspx

0

我的解決方案比較簡單:

Object retorno; 
var response = wb.UploadValues(url, "POST", data); 
using (var responseReader = new StreamReader(new MemoryStream(response))) 
{ 
    retorno = JsonConvert.DeserializeObject<Object>(responseReader.ReadToEnd()); 
}