【发布时间】:2014-05-16 02:06:44
【问题描述】:
我有一个来自 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);
然后我得到这个异常:
无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“VisiStatSystem.DateUnique”,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。 路径“[0]”,第 1 行,位置 2。
我在 Json.net 文档中没有看到任何示例,这些示例显示了如何反序列化看起来像 VisiStat Api 返回的 Json 字符串。任何帮助表示赞赏!
【问题讨论】:
-
JSON 未排序。解析器不能假定数组中的第一个索引对应于类中的第一个对象。我不熟悉您使用的反序列化器,但您可能必须编写自己的逻辑来识别哪个是日期,哪个是整数。
-
它更像是 csv 字符串而不是 json 字符串,所以我建议你改用正则表达式。
-
那个数据是一个字符串数组。它是带有标题的表转储这一事实是对数据的解释。
-
@ChrisHayes JSON 对象中的属性可能没有排序,但 JSON 数组肯定是排序的。 (参见JSON.org,页面上的第二个要点。)