C#JsonConvert - 多种类型的列表

时间:2015-08-13 11:42:41

标签: c# json list serialization

所以我正在尝试解析看起来有点像这样的JSON请求:

{
"source_code":"MOODY",
"code":"DAAAYLD",
"name":"Aaa Corporate Bond Yield",
"data":[
    [
        "2015-08-11",
        3.96
    ],
    [
        "2015-08-10",
        4.06
    ],
    [
        "2015-08-07",
        3.96
    ]
]
}

还有一些我遗漏的东西,但它们并不重要。现在,我正在使用

var jsonData = JsonConvert.DeserializeObject<JsonResponseObj>(GetRawData(code));

制作一个类似于:

的JsonResponseObj
public class JsonResponseObj
    {
        [JsonProperty("name")]
        public string name { get; set; }

        [JsonProperty("code")]
        public string code { get; set; }

        [JsonProperty("source_code")]
        public string source_code { get; set; }

        [JsonProperty("description")]
        public string description { get; set; }

        [JsonProperty("data")]
        public List<List<string>> data { get; set; }
    }

如果省略“data”属性,这适用于获取名称,代码等,但是因为数据本身是列表列表(或者如果你想以这样的方式查看它的两元组列表)我不太确定获取它的正确方法是什么。我尝试了一些似乎打破解析器的东西,包括对我来说最明显的一个:

[JsonProperty("data")]
public List<Tuple<string, float>> data { get; set; }

然而,这只会给出错误:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型   'System.Tuple`2 [System.String,System.Single]'因为类型   需要一个JSON对象(例如{“name”:“value”})来反序列化   正确。

但实际类型不是JSON对象,因为它没有键/值对,每种类型的“string,float”只有2个值。

有关如何最好地解析数据以获取数据的任何线索?

2 个答案:

答案 0 :(得分:3)

好的,所以我发现了一些动态类型,它们不再使用JSON的单独静态对象,而这些对象不适用于嵌套列表字符串。

基本上我用一行代码解决了它:

dynamic jsonData = JsonConvert.DeserializeObject<dynamic>(rawJsonStr);

这意味着我可以直接调用顶级值,并使用JArray迭代&#34;数据&#34;列表如下:

string name = jsonData.name;
string data_code = jsonData.code;
string source_code = jsonData.source_code;
JArray data = jsonData.data;
foreach (var point in data)
{
    System.Diagnostics.Debug.WriteLine(point[0] + " | " + point[1]);    
}

答案 1 :(得分:0)

问题的存在是因为数据它不是List&gt;,因为每个条目都包含字符串和双元素,因此我可以快速解决此问题,只需将您的类实现为以下。

公共类JsonResponseObj     {         [JsonProperty(&#34;名称&#34)]         公共字符串名称{get;组; }

    [JsonProperty("code")]
    public string code { get; set; }

    [JsonProperty("source_code")]
    public string source_code { get; set; }

    [JsonProperty("description")]
    public string description { get; set; }

    [JsonProperty("data")]
    public List<Dictionary<string,double>> data { get; set; }
}