【问题标题】:How to parse Json value of arrays c#如何解析数组c#的Json值
【发布时间】:2013-07-23 21:58:41
【问题描述】:

我收到以下 Json 响应:

{"time_series_data":"[[2013-07-23T09:45:00,0.991],[2013-07-23T10:00:00,1.047],[2013-07-23T10:15:00,0.069 ],[2013-07-23T10:30:00,1.001],[2013-07-23T10:45:00,0.947],[2013-07-23T11:00:00,0.278],[2013-07-23T11 :15:00,0.48],[2013-07-23T11:30:00,0.709],[2013-07-23T11:45:00,1.315],[2013-07-23T12:00:00,0.89], [2013-07-23T12:15:00,0.31],[2013-07-23T12:30:00,0.121],[2013-07-23T12:45:00,0.593],[2013-07-23T13:00 :00,0.513],[2013-07-23T13:15:00,0.222],[2013-07-23T13:30:00,1.759],[2013-07-23T13:45:00,1.715],[2013 -07-23T14:00:00,1.439],[2013-07-23T14:15:00,0.448],[2013-07-23T14:30:00,0.105]]"}

我如何将这些日期和双打读入列表?

我尝试过使用 Json.net,但我不能完全确定上面的值集合被称为什么。使用以下代码,我可以提取 [[ 和 ]] 括号之间的值,但我不确定如何从这里开始。

JsonTextReader jR = new JsonTextReader(new StringReader(WebApiURL));

string data = "";

while (jR.Read())
{
    if (jR.Value != null && jR.Value != "time_series_data")
    data = jR.Value.ToString();
}

我可以使用 Json.net 或原生 c#。建议?

【问题讨论】:

  • 那不是有效的 JSON。 2013-07-23T14:15:00 需要被引用。
  • @Blender:嗯……我的理解是字符串上的引号是 json 的可变区域之一。有时它们被使用,有时不被使用。无论如何,上面的 JSON 在 jsonlint.com 处检查为有效
  • 抱歉,我没有注意到 time_series_dataentire 值周围的引号。 JSON 中的双引号需要围绕字符串。
  • 为了将来参考,Json 库需要在字符串周围加上引号才能正确输入/解析 Json 结果。

标签: json c#-4.0 json.net


【解决方案1】:

虽然您获得的 JSON 响应是有效的 JSON作为一个整体,但它的格式无法让您使用标准 JSON 库轻松提取日期和小数。

第一个问题是“数组”部分实际上是在一个字符串值内。您可能认为您可以简单地获取字符串值并尝试将其重新解析为 JSON,但随后您会遇到另一个问题:字符串值本身不是有效的 JSON 数组,正如 @Blender 所注意到的。为了使其有效,需要引用日期值,因为 JSON 没有本机日期表示。

因此,无论哪种方式,您都必须对数据进行一些手动处理以提取值。幸运的是,使用正则表达式拆分字符串并不是很困难。这是我将采取的方法:

首先,定义一个简单的类来保存您的数据项。

class DataItem
{
    public DateTime Date { get; set; }
    public double Number { get; set; }
}

然后,从你离开的地方开始,你可以像这样解析你的 data 字符串:

List<DataItem> timeSeriesData = new List<DataItem>();
string[] pairs = Regex.Split(data, @"\[\[|\],\[|\]\]");
foreach (string pair in pairs)
{
    if (!string.IsNullOrEmpty(pair) && char.IsDigit(pair[0]))   // sanity check
    {
        string[] parts = pair.Split(',');
        DateTime date = DateTime.Parse(parts[0], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
        double number = double.Parse(parts[1]);
        timeSeriesData.Add(new DataItem { Date = date, Number = number });
    }
}

现在您可以根据需要使用timeSeriesData 列表。

【讨论】:

  • 好吧,我在这里学到了一些东西:1.如何描述我的数据的第二部分(非标准Json); 2. 更多关于如何形成有效的Json; 3. 如何解析非标准 Json(Regex 是我无法理解的步骤;以及 4. 如何正确构建数据类(感谢您的示例)。一个答案包含了这么多内容。谢谢您彻底!
  • 顺便说一句,DateTime.Parse 行没有正确解析我的格式为 2013-07-23T09:45:00 的日期。我收到了转换错误。我构建了自己的方法来解析日期部分并重建日期时间,但是在 c# 中是否有内置方法来解析这种日期格式?
  • Hmmmm,在我发布答案之前,我使用您在问题中的示例 JSON 测试了代码,并且所有日期都为我解析且没有错误。我不确定为什么它对你不起作用。 documentation for DateTime.Parse 提供了以与数据相同的形式解析日期的示例。
【解决方案2】:

您可以使用http://json2csharp.com/ 来获取 VALID json 的对象结构,您可以使用 Json.net 库来解析它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多