c# - 在 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]]
水果是动态属性的地方
解决方案
也许不是答案(假设使用 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。服务器将以特定格式提供数据,并且必须单独处理提供用户友好显示的操作。这种操作可以在服务器上完成(如果另一个客户端需要,可以很容易地移除)或在客户端本身,从而将客户端特定的代码保留在一个地方。
我希望这是有道理的。
推荐阅读
- python - (Windows 10)无法使用 Anaconda 提示 - AttributeError:模块“colorama”没有属性“init”
- javascript - javascript:我的 appendChild 只工作一次
- assembly - 如何使用 DPMI 将内存分配给特定的虚拟地址?
- numpy - 查找参数样条曲线和直线之间的交点
- python - AttributeError:当应用 Global MaxPooling 而不是 GlobalAveragePooling 时,“Tensor”对象没有属性“lower”
- python - 有没有办法在情节中添加到图像的超链接?
- apache-spark - 无法运行示例,错误“-Xmx1g org.apache.spark.deploy.SparkSubmit”
- swift - ViewDidLoad 中与 CoreData 相关的崩溃
- google-apps-script - Google Spreadsheets ArrayFormula:如何拆分和转置单元格范围?
- ansible - ansible include_tasks 忽略标签