0

如果有帮助,我正在使用 CampBX API 来获取我账户中的资金。我编写了以下代码来进行 API 调用:

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()返回 a byte[],我不知道如何正确解析它。

这是 Account Balances 下的 CampBX 信息

4

3 回答 3

1

简单地说,您需要使用 JSON 解析器。就我个人而言,我喜欢Newtonsoft.Json,这就是我将在本示例中使用的。

第一步是将 转换byte[]为字符序列,字符串对象或TextReader. 第二步是将这些信息传递给解析器。因此,在您的情况下,代码将如下所示:

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

parsedToken然后可以使用该对象来提取您需要的任何数据。(有关从对象中提取数据的信息,请参阅文档JToken。)

请注意,WebClient.UploadValues()丢弃有关响应实体的字符编码的信息。 StreamReader默认将使用 UTF-8 编码,这足以解析 UTF-8 或 ASCII。根据服务器使用的 JSON 编码器,响应可能始终与 ASCII 兼容,因此您可能不必担心。不过,这是您应该调查的事情。

于 2013-06-12T16:32:06.900 回答
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

于 2013-06-12T16:48:49.920 回答
0

我的解决方案更简单:

Object retorno;
var response = wb.UploadValues(url, "POST", data);
using (var responseReader = new StreamReader(new MemoryStream(response))) 
{
    retorno = JsonConvert.DeserializeObject<Object>(responseReader.ReadToEnd());
}
于 2016-01-30T17:17:38.503 回答