C# 用c为多系列图表创建数据结构

C# 用c为多系列图表创建数据结构,c#,json,dynamic,chart.js,chartkick,C#,Json,Dynamic,Chart.js,Chartkick,我使用chartkick.js,而chartkick.js又使用chartjs,我想用C为多系列图表创建数据结构,它看起来像这个json对象: series = [ {name: "User1", data: {"bananas": 3, "Apples": 4}}, {name: "User2", data: {"bananas": 5, "Apples": 3}} ] 请注意,在chartkick中,数组数组的工作方式如下: [["bananas", 3], ["Apples",

我使用chartkick.js,而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


其中的结果是动态属性

假设使用NewtonsoftJSON,则可能不是答案

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

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

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可能被多个客户端类型使用,也可能不被多个客户端类型使用时。服务器将以特定的格式提供数据,它提供用户友好显示的操作必须单独处理。这种操作可以在服务器上完成,如果另一个客户端需要,也可以在客户端本身完成,从而在一个位置保留特定于客户端的代码


我希望这是有意义的。

您是否检查了此链接?我认为这是您的解决方案,取决于反序列化程序。如果字典转换为对象或列表,我将检查您的序列化程序设置。是的,这确实是awnser,thx
[["bananas", 3], ["Apples", 4]]
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; }
}