C# 如何使用Json.net解析Visistat API的Json输出

C# 如何使用Json.net解析Visistat API的Json输出,c#,json,json.net,C#,Json,Json.net,我有一个来自Visistat.com的API的Json字符串,我正试图用Json.Net用C#解析它。Json字符串如下所示: [ ["date", "uniques"], ["2014-04-15", "613"], ["2014-04-16", "631"], ["2014-04-17", "593"], ["2014-04-18", "466"], ["2014-04-19", "305"], ["2014-04-20", "294"

我有一个来自Visistat.com的API的Json字符串,我正试图用Json.Net用C#解析它。Json字符串如下所示:

[
    ["date", "uniques"],
    ["2014-04-15", "613"],
    ["2014-04-16", "631"],
    ["2014-04-17", "593"],
    ["2014-04-18", "466"],
    ["2014-04-19", "305"],
    ["2014-04-20", "294"],
    ["2014-04-21", "795"],
    ["2014-04-22", "666"],
    ["2014-04-23", "625"],
    ["2014-04-24", "571"],
    ["2014-04-25", "506"],
    ["2014-04-26", "342"],
    ["2014-04-27", "351"],
    ["2014-04-28", "720"],
    ["2014-04-29", "606"],
    ["2014-04-30", "588"],
    ["2014-05-01", "508"],
    ["2014-05-02", "545"],
    ["2014-05-03", "345"],
    ["2014-05-04", "379"],
    ["2014-05-05", "833"],
    ["2014-05-06", "635"],
    ["2014-05-07", "596"],
    ["2014-05-08", "530"],
    ["2014-05-09", "539"],
    ["2014-05-10", "322"],
    ["2014-05-11", "290"],
    ["2014-05-12", "734"],
    ["2014-05-13", "684"],
    ["2014-05-14", "555"],
    ["2014-05-15", "511"]
]
我创建了一个对象,将其反序列化为:

public class DateUnique
{
    public DateTime date { get; set; }
    public int uniques { get; set; }
}
然后,我尝试用以下代码解析Json字符串:

List<DateUnique> dateuniques = JsonConvert.DeserializeObject<List<DateUnique>>(json);
List-dateuniques=JsonConvert.DeserializeObject(json);
然后我得到一个例外:

无法将当前JSON数组(例如[1,2,3])反序列化为类型“VisiStatSystem.DateUnique”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现可从JSON数组反序列化的集合接口(例如ICollection、IList)类似列表的类型。还可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化。 路径“[0]”,第1行,位置2


在Json.net文档中,我没有看到任何示例显示如何反序列化Json字符串,该字符串看起来像VisiStat Api返回的字符串。感谢您的帮助

之所以出现此错误,是因为您的JSON是一个数组数组,而不是一个对象数组,而您正试图将其解析为后者。要将其反序列化到
列表中
,需要进行一些特殊处理

以下代码应该可以工作:

JArray array = JArray.Parse(json);
List<DateUnique> list = new List<DateUnique>(array.Count - 1);
for (int i = 1; i < array.Count; i++)
{
    list.Add(new DateUnique
    {
        date = DateTime.ParseExact(array[i][0].ToString(), 
            "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture),
        uniques = int.Parse(array[i][1].ToString())
    });
}
JArray数组=JArray.Parse(json); 列表=新列表(array.Count-1); for(int i=1;iJSON未订购。解析器不能假设数组中的第一个索引对应于类中的第一个对象。我不熟悉您正在使用的反序列化程序,但您可能需要编写自己的逻辑来识别哪个是日期,哪个是整数。它更像csv字符串而不是json字符串,因此我建议您使用正则表达式。该数据是字符串数组的数组。它是一个带有标题的表转储,这是对数据的一种解释。@JSON对象中的ChrisHayes属性可能没有顺序,但JSON数组肯定是有顺序的。(请参见本页第二个要点。)