【问题标题】:How to parse Json output from Visistat API using Json.net如何使用 Json.net 解析来自 Visistat API 的 Json 输出
【发布时间】: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,页面上的第二个要点。)

标签: c# json json.net


【解决方案1】:

您收到此错误是因为您的 JSON 是数组数组,而不是对象数组,而您尝试将其解析为后者。您需要进行一些特殊处理才能将其反序列化为List&lt;DateUnique&gt;

以下代码应该可以工作:

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())
    });
}

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2015-08-05
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多