c#从Quandl中反序列化Json字符串
本文关键字:Json 字符串 反序列化 Quandl | 更新日期: 2023-09-27 18:13:27
我花了几个小时在这个问题上,仍然找不到答案。我有一个Json字符串需要反序列化。它应该很简单,但我得到以下错误信息:
解析值时遇到意外字符:Q. Path ",第0行,位置0.
我的json字符串如下:
https://www.quandl.com/api/v1/datasets/FRED/GDP.json?auth_token=Mi1xP1q2776TU4kmGcHo&崩溃= monthly&转换= none& sort_order = asc&行= 100
指向Quandl在线数据库提供的Json字符串的链接。
我使用了以下网址:
http://json2csharp.com/生成所需的类。
我明白我必须反序列化到这个类使用:
var result = JsonConvert.DeserializeObject<List<RootObject>>(request.jsonString);
但是它不工作。
下面是我的完整代码: public class Errors
{
}
public class RootObject
{
public Errors errors { get; set; }
public int id { get; set; }
public string source_name { get; set; }
public string source_code { get; set; }
public string code { get; set; }
public string name { get; set; }
public string urlize_name { get; set; }
public string display_url { get; set; }
public string description { get; set; }
public string updated_at { get; set; }
public string frequency { get; set; }
public string from_date { get; set; }
public string to_date { get; set; }
public List<string> column_names { get; set; }
public bool @private { get; set; }
public object type { get; set; }
public bool premium { get; set; }
public List<List<object>> data { get; set; }
}
private void PullFromQuandl()
{
QuandlDownloadRequest request = new QuandlDownloadRequest();
request.APIKey = "Mi1xP1q2776TU4kmGcHo";
request.Datacode = new Datacode("FRED", "GDP");
request.Format = FileFormats.JSON;
request.Frequency = Frequencies.Monthly;
request.Truncation = 100;
request.Sort = SortOrders.Ascending;
string jsonString = request.ToRequestString();
var result = JsonConvert.DeserializeObject<List<RootObject>> (jsonString);
}
您可以将此标记为答案,因为您发布的答案可以通过查看quandl api更轻松地完成:
using QuandlCS.Connection; // need to use this
和
QuandlConnection conn = new QuandlConnection ();
string json = conn.Request(request); // request is your QuandlDownloadRequst
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
和你的答案是一样的。他们有专门的课程:D
要了解更多参考,请查看他们的c# api文档:https://github.com/HubertJ/QuandlCS
该字符串确实是一个json字符串。谢谢你提供的链接。我犯了一个愚蠢的错误。匡德尔正在返回字符串的链接。所以我使用HttpWebRequest来获取字符串本身。然后我按照你的建议编辑了反序列化。我认为它起作用了。现在的问题是,它没有绑定到我的datagridview。
private void PullFromQuandl()
{
QuandlDownloadRequest request = new QuandlDownloadRequest();
request.APIKey = "Mi1xP1q2776TU4kmGcHo";
request.Datacode = new Datacode("CURRFX", "EURUSD");
request.Format = FileFormats.JSON;
request.Frequency = Frequencies.Monthly;
request.Truncation = 100;
request.Sort = SortOrders.Ascending;
string jsonString = request.ToRequestString();
HttpWebRequest request2 = null;
HttpWebResponse response = null;
string returnData = string.Empty;
request2 = (HttpWebRequest)System.Net.WebRequest.Create(new Uri(jsonString));
request2.Method = "GET";
response = (HttpWebResponse)request2.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
returnData = reader.ReadToEnd();
var result = JsonConvert.DeserializeObject<RootObject>(returnData);
dgvPending.DataSource = result;
}
首先:避免对象类型。JSON序列化器->反序列化器通常有问题。
第二:JsonConvert.DeserializeObject<List<RootObject>> (jsonString);
您正在尝试反序列化RootObject数组。但是提供的json只包含一个。应该是:
JsonConvert.DeserializeObject<RootObject> (jsonString);
第三:string jsonString = request.ToRequestString();
可以调试并查看jsonString
是否实际上包含有效的json(使用http://jsonlint.org/)。在我看来,你需要一个响应字符串,而不是一个请求字符串。(我认为这就是为什么你得到错误!!)
可能会有更多的错误。我有点怀疑默认设置的json反序列化器是否能够正确解码数据数组。但List<List<object>>
值得一试。如果它给出一个错误,尝试List<List<string>>
代替。如果这不起作用,你可能不得不手动操作。
请用调试器检查json 我认为你想要反序列化的不是你在这里发布的!
also:你从哪个库使用这个:JsonConvert.DeserializeObject
?
谁****设计了他们的API来生成那种json:
[
[
"1947-01-31",
243.1
]
]
这就是简单明了的弱智(我只是不得不说)