首页 > 解决方案 > 在 C# 中为多个系列图表创建数据结构

问题描述

我正在使用 chartkick.js(它又使用 chartjs),我想在 C# 中为多系列图表创建数据结构,它看起来像这个 json 对象:

series = [
  {name: "User1", data: {"bananas": 3, "Apples": 4}},
  {name: "User2", data: {"bananas": 5, "Apples": 3}}
]

请注意,在 chartkick 中,一组数组将像这样工作:

[["bananas", 3], ["Apples", 4]]

我有一个类来存储每个用户的数据:

public class GenericChartJsSeriesModel : ReportDataModel
{
    public string Name { get; set; }
    public ????? Data { get; set; }
}

我尝试了很多,包括:

Dictionary<string, int> //[{["bananas", 1]},{["appels", 1]}]
List<KeyValuePair<string, int>> //{ key: "bananas", value: 1}
string[][] //<- wont work because the values must be numeric

所以问题基本上是:如何创建

{"bananas": 3, "Apples": 4}

或者

[["bananas", 3], ["Apples", 4]]

水果是动态属性的地方

标签: c#jsondynamicchart.jschartkick

解决方案


也许不是答案(假设使用 NewtonsoftJSON)。

实施自定义ContractResolver将为您解决这个问题。您可以根据需要遍历属性并构建 JSON。有一个 SO question 已经展示了如何实现自定义解析器。你可以在这里找到它。

那么这个类可能看起来是这样的:

class Sample
{
    public string Name { get; set; }

    public Collection<DataClass> Data { get; set; }
}

public class DataClass
{
    public string AttributeName { get; set; }

    public int Value { get; set; }
}

就我而言,这样做的理由是关注点分离。服务器端代码不应该真正担心客户端控件如何需要数据。特别是如果您正在编写可能会或可能不会被多种客户端类型使用的 API。服务器将以特定格式提供数据,并且必须单独处理提供用户友好显示的操作。这种操作可以在服务器上完成(如果另一个客户端需要,可以很容易地移除)或在客户端本身,从而将客户端特定的代码保留在一个地方。

我希望这是有道理的。


推荐阅读