【问题标题】:Converting C# List into JSON specific format将 C# 列表转换为 JSON 特定格式
【发布时间】:2017-03-14 14:08:25
【问题描述】:

我的视图中有一个图表,如下所示:

  var hourlyGraph = Morris.Bar({
            element: 'graph_bar',
            data: [
               @foreach (var item in ViewBag.HourlyGraph)
               {
                @:{device: '@item.Hour.ToString("D2"):00', geekbench:@item.Sales },
               }
            ],
            xkey: 'device',
            ykeys: ['geekbench'],
            labels: ['Sold'],
            barRatio: 0.4,
            barColors: ['#0A4D70', '#34495E', '#ACADAC', '#3498DB'],
            xLabelAngle: 35,
            hideHover: 'auto',
            resize: true
      });

这是一张莫里斯图。注意这里的数据是如何设置的:

[
@foreach (var item in ViewBag.HourlyGraph)
{
@:{device: '@item.Hour.ToString("D2"):00', geekbench:@item.Sales },
}
]

现在我需要用新数据填充图表。在我的操作中,我创建了一个包含 2 个属性的列表:

public int Hour {get;set;}
public int Sales {get;set;}

它们被存储在一个列表中:

var HourlyGraph = new List<HourlyGraph>();

现在我想将此列表转换为 JSON 格式,如下所示:

[
{device: '0', geekbench:5 },
{device: '1', geekbench:13 },
{device: '2', geekbench:25 },
{device: '3', geekbench:14 },
{device: '4', geekbench:16 },
]

设备的价值是 = 小时,而 geekbench = 销售额......

我如何在 C# 中做到这一点?

【问题讨论】:

  • 这样的东西行得通吗? new JavaScriptSerializer().Deserialize(yourList);
  • 您看过 Newtonsoft.JSON 库了吗?你会在 nuget 上找到它
  • @TomDoodler 是的,但让我感到困惑的是如何将 json 中的第一个字符串设置为命名为“device”和“geekbench”?
  • @joab "device" 和 "geekbench" 值呢,我如何将它们放在 JSON 响应中?
  • 这样的东西行得通吗? [JsonProperty(PropertyName = "device")] public int Hour {get;set;}

标签: c# asp.net json asp.net-mvc


【解决方案1】:

使用 Json.Net 和 Linq 很容易:

string myJson = 
   JsonConvert.SerializeObject(mylist.Select(item=>
                                  new {device=item.Hour, geekbench=item.Sales}));

您使用所需的字段和名称投影一个匿名类型,然后让 Newtonsoft.Json 完成其余的工作。

【讨论】:

  • Ofir,这是 NewtonSoft.JSON 库,不是吗?它说它不包含方法“Serialize”...?
  • 对不起,是 SerializeObject
  • Ofir,另一个简单的问题,说 i.Sales 不存在...?应该是 item.Sales 还是?
  • 哦,我和我的错别字...确定是项目
  • 哈哈发生了,谢谢很多=D ..顺便说一句。这个动作的返回类型应该是字符串还是JsonResponse?还是只是一个简单的字符串?
【解决方案2】:

既然您使用的是 mvc,为什么不使用 return Json() 它会将 object 转换为 json 字符串,您可以像这样使用它

  public ActionResult Myaction()
    { 
        var HourlyGraph = new List<HourlyGraph>();


        return Json(HourlyGraph.Select(x => new {Hour=x.Hour,Sales=x.Sales }));
    }

【讨论】:

  • 乌斯曼这看起来好得令人难以置信哈哈...等一下我会试试的 =D
【解决方案3】:

您可以通过使用 LINQ 匿名类型来实现所需的输出

按照下面的例子是类

public class HourlyGraph
{
    public int Hour { get; set; }
    public int Sales { get; set; }
}

Import Namespace System.Web.Script.Serialization 是微软处理 JSON 的内置类。您将需要使用“添加引用”来引用名为 System.Web.Extensions 的附加程序集。

using System.Web.Script.Serialization;

声明列表并转换成自定义的JSON格式

        var listHourlyGraph = new List<HourlyGraph>();

        //Adding some Sample Values
        listHourlyGraph.Add(new HourlyGraph() { Hour = 0, Sales = 5 });
        listHourlyGraph.Add(new HourlyGraph() { Hour = 1, Sales = 10 });

        //Declaring JavaScriptSerialzer Object
        var serialzer = new JavaScriptSerializer();

        //Using Serialize Method which returns back a JSON String
        //We are using LINQ SELECT Method to create a new anonymous return type which contains our custom return types
        string s = serialzer.Serialize(listHourlyGraph.Select(x => new { device = x.Hour, geekbench = x.Sales } ));

你会在's'变量中得到以下输出

[{"device":0,"geekbench":5},{"device":1,"geekbench":10}]

注意:如果你想获得性能优化,那么你最好使用Newtonsoft JSON而不是微软的默认 JSON 库。

【讨论】:

  • 如果您希望 JSON 值作为字符串而不是整数,也可以添加,然后在异常类型中使用 C# 的 ToString() 方法。例如 string s = serialzer.Serialize(listHourlyGraph.Select(x => new { device = x.Hour.ToString(), geekbench = x.Sales.ToString() } ));
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2021-02-04
相关资源
最近更新 更多