C# 反序列化来自 Quandl 的 Json 字符串
C# Deserialize Json string from Quandl
我为此花了几个小时,但仍然找不到答案。我有一个 Json 字符串需要反序列化。它应该很简单,但我收到以下错误消息:
Unexpected character encountered while parsing value: Q. Path '', line 0, position 0.
我的 json 字符串如下:
是Quandl在线数据库提供的link到Json字符串。
我使用了以下网站:
生成必要的class.
我知道我必须反序列化到这个 class 使用:
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);
}
首先:避免对象类型。 JSON 序列化器 -> 反序列化器通常有问题。
第二个:
JsonConvert.DeserializeObject<List<RootObject>> (jsonString);
您正在尝试反序列化 RootObject 数组。但提供的 json 只包含一个。应该是:
JsonConvert.DeserializeObject<RootObject> (jsonString);
第三名:
string jsonString = request.ToRequestString();
你能否调试并查看 jsonString
是否实际包含有效的 json(使用 http://jsonlint.org/)。在我看来,您需要 response 字符串而不是请求字符串。 (我想这就是你得到错误的原因!!!)
第四名:
可能会有更多错误。我有点怀疑具有默认设置的 json 解串器是否能够正确解码数据数组。但是 List<List<object>>
值得一试。如果出现错误,请尝试 List<List<string>>
。如果这不起作用,您可能必须手动完成。
请用调试器检查json。我认为您要反序列化的不是您在此处发布的内容!
还有:你从哪个图书馆使用这个:JsonConvert.DeserializeObject
?
第五名:
**** 是谁设计的 api 来生产那种 json:
[
[
"1947-01-31",
243.1
]
]
这就是简单明了的弱智(我不得不说)
该字符串确实是 json 字符串。感谢您提供的 link。
我犯了一个愚蠢的错误。 Quandl 将 link 返回给字符串。
所以我使用 HttpWebRequest 来获取字符串本身。
然后我按照你的建议编辑了反序列化。
我认为它奏效了。现在的问题是它没有绑定到我的数据网格视图。
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;
}
您可以将此标记为答案,因为通过查看 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);
和你回答的一样。他们有一个 class :D
如需进一步参考,请查看他们的 C# api 文档:https://github.com/HubertJ/QuandlCS
我为此花了几个小时,但仍然找不到答案。我有一个 Json 字符串需要反序列化。它应该很简单,但我收到以下错误消息:
Unexpected character encountered while parsing value: Q. Path '', line 0, position 0.
我的 json 字符串如下:
是Quandl在线数据库提供的link到Json字符串。
我使用了以下网站:
生成必要的class.
我知道我必须反序列化到这个 class 使用:
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);
}
首先:避免对象类型。 JSON 序列化器 -> 反序列化器通常有问题。
第二个:
JsonConvert.DeserializeObject<List<RootObject>> (jsonString);
您正在尝试反序列化 RootObject 数组。但提供的 json 只包含一个。应该是:
JsonConvert.DeserializeObject<RootObject> (jsonString);
第三名:
string jsonString = request.ToRequestString();
你能否调试并查看 jsonString
是否实际包含有效的 json(使用 http://jsonlint.org/)。在我看来,您需要 response 字符串而不是请求字符串。 (我想这就是你得到错误的原因!!!)
第四名:
可能会有更多错误。我有点怀疑具有默认设置的 json 解串器是否能够正确解码数据数组。但是 List<List<object>>
值得一试。如果出现错误,请尝试 List<List<string>>
。如果这不起作用,您可能必须手动完成。
请用调试器检查json。我认为您要反序列化的不是您在此处发布的内容!
还有:你从哪个图书馆使用这个:JsonConvert.DeserializeObject
?
第五名:
**** 是谁设计的 api 来生产那种 json:
[
[
"1947-01-31",
243.1
]
]
这就是简单明了的弱智(我不得不说)
该字符串确实是 json 字符串。感谢您提供的 link。 我犯了一个愚蠢的错误。 Quandl 将 link 返回给字符串。 所以我使用 HttpWebRequest 来获取字符串本身。 然后我按照你的建议编辑了反序列化。 我认为它奏效了。现在的问题是它没有绑定到我的数据网格视图。
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;
}
您可以将此标记为答案,因为通过查看 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);
和你回答的一样。他们有一个 class :D
如需进一步参考,请查看他们的 C# api 文档:https://github.com/HubertJ/QuandlCS