【问题标题】:Using Json.Net to prepare data for Flot Graph Javascript library使用 Json.Net 为 Flot Graph Javascript 库准备数据
【发布时间】:2014-08-11 15:47:06
【问题描述】:

我正在使用 Json.net 为 Flot Javascript 库创建数据结构

public ActionResult PrepareChartData(int id)
{
    List<DeviceChannel> deviceChannel = (from dc in db.DeviceChannels.Include(c => c.Device)
                                .Include(c => c.Channel).OrderBy(c => c.ChannelID)
                                .Where(c => c.DeviceID == id)
                                select dc).ToList();
    List<ChannelData> channelData = (from cd in db.ChannelDatas
                                    join dc in db.DeviceChannels on cd.DeviceChannelID equals dc.DeviceChannelID
                                    where cd.DeviceChannelID == id
                                    select cd).ToList();
    JObject retVal = new JObject(new JProperty("",
                                new JArray(
                                    from x in deviceChannel
                                    select new JObject (
                                        new JProperty("label", x.Channel.Description),
                                        new JProperty("data",
                                        new JArray(
                                                from cd in  channelData
                                                select new JArray(new JValue(cd.DataDateTime),new JValue(cd.Value))
                                            )
                                        )
                                    )
                                )    
                            )
                        );
    return Json(retVal, JsonRequestBehavior.AllowGet);
}

问题似乎是 JSon.Net 不允许在 JObject 中直接使用 JArray,所以我添加了一个 JProperty 但与 Flot 库所需的结构不匹配

"": [
    {
      "label": "Voltage A",
      "data": [
        [
          "2014-06-25T14:24:38.41",
          750.0
        ],
        [
          "2014-06-25T15:28:04.427",
          750.0
        ],
        [
          "2014-06-25T16:29:13.757",
          750.0
        ]
      ]
    },
    {
      "label": "Voltage B",
      "data": [
        [
          "2014-06-25T14:24:38.41",
          750.0
        ],
        [
          "2014-06-25T15:28:04.427",
          750.0
        ],
        [
          "2014-06-25T16:29:13.757",
          750.0
        ],
      ]
    }
   ]

问题:我是使用不同的方法来生成数据结构还是可以使用 JSON.Net 来生成?

【问题讨论】:

  • 如果你想要一个数组,那为什么不直接使用JArray retVal = new JArray(from x呢?还是我在这里误解了什么?
  • 感谢 cmets/edits - 我没有意识到我可以直接使用 JArray。

标签: c# json.net flot


【解决方案1】:

除了@Stijn 在他的评论中所说的,flot 也不会喜欢那些日期时间字符串。 working with time 时需要 javascript 纪元。你想要类似(未经测试)的东西:

JArray retVal = new JArray(
      from x in deviceChannel
      select new JObject (
          new JProperty("label", x.Channel.Description),
          new JProperty("data",
          new JArray(
                from cd in channelData
                select new JArray(new JValue((cd.DataDateTime - new DateTime(1970,1,1)).TotalSeconds * 1000),new JValue(cd.Value))
            )
        )
    )
);

更新

基本上 MVC 框架不知道如何序列化 JSON.NET 对象。你可以很简单地强制它,见这个question和这个one。但在你走这条路之前,你应该决定你的应用程序使用哪个 JSON 库。 MVC 使用内置的 JavascriptSerializer,除非您迫切需要使用 JSON.NET(它更快),否则我会坚持使用它。这是类似的代码(我没有你的 linq 结构,所以这只是一个演示):

    public class FlotSeries
    {
        public List<double[]> data;
        public string label;
    }

    public ActionResult Test()
    {
        FlotSeries flotSeries = new FlotSeries();
        flotSeries.label = "Series1";
        flotSeries.data = new List<double[]>();
        flotSeries.data.Add(new double[] { (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds * 1000, 23.0 });
        flotSeries.data.Add(new double[] { (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds * 1000, 12.0 });
        return Json(flotSeries, JsonRequestBehavior.AllowGet);
    }

生成的 JSON:

{"data":[[1407837905793.7207,23],[1407837905793.7207,12]],"label":"Series1"}

更新:

public ActionResult PrepareChartData(int id)
{
    List<FlotSeries> _flotSeries = new List<FlotSeries>();
    var deviceChannels = db.DeviceChannels
                        .Include(c=>c.Channel)
                        .OrderBy(c=>c.ChannelID)
                        .Where(c=>c.DeviceID==id);
    foreach (var dc in deviceChannels)
    {
        FlotSeries fs = new FlotSeries();
        fs.data = new List<double[]>();
        fs.label = dc.Channel.Description;
        var channelDatas = db.ChannelDatas
                        .OrderBy(c => c.DataDateTime)
                        .Where(c => c.DeviceChannelID == dc.DeviceChannelID);
        foreach (var q in channelDatas)
        {
            fs.data.Add( new Double[] {(q.DataDateTime - new DateTime(1970, 1, 1)).TotalSeconds * 1000, q.Value }  );   
        }
        _flotSeries.Add(fs);
    }
    return Json(_flotSeries, JsonRequestBehavior.AllowGet);
}

【讨论】:

  • 这段代码生成了一个我需要的 JSON 对象。一个服务器端对象包含数据,但是当它返回到客户端时,要么进入我的视图(.cshmtl),要么直接使用浏览器定位 URL,结构与 [] {} 的预期相同,但所有数据都有被移除。我尝试将“application/json”添加到 Json() 返回对象。
  • @EricHewett,您使用的是哪个版本的 ASP.NET/MVC?
  • ASP.NET MVC 5.2.0 Json.net 6.0.4
  • 谢谢@Mark 我得出了类似的结论——我找到了这个stackoverflow.com/questions/14913324/…,但你已经把它移到了下一步。非常令人沮丧。我会试试你的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2017-05-26
相关资源
最近更新 更多