2013-06-12 52 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()); 
}