C# 反序列化来自 Quandl 的 Json 字符串

C# Deserialize Json string from Quandl

我为此花了几个小时,但仍然找不到答案。我有一个 Json 字符串需要反序列化。它应该很简单,但我收到以下错误消息:

Unexpected character encountered while parsing value: Q. Path '', line 0, position 0.

我的 json 字符串如下:

https://www.quandl.com/api/v1/datasets/FRED/GDP.json?auth_token=Mi1xP1q2776TU4kmGcHo&collapse=monthly&transformation=none&sort_order=asc&rows=100

是Quandl在线数据库提供的link到Json字符串。

我使用了以下网站:

http://json2csharp.com/

生成必要的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