Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将动态C#对象序列化为JSON_C#_Asp.net Mvc_Razor - Fatal编程技术网

将动态C#对象序列化为JSON

将动态C#对象序列化为JSON,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有一个ASP.NETMVC应用程序。此应用程序包括C#、Razor和JSON.NET。我有一个C#对象,看起来像这样: public class MyBlueprint { public string Name { get; set; } public string Approach { get; set; } public object Value { get; set; } } List<MyBlueprint> x = new List<MyBluep

我有一个ASP.NETMVC应用程序。此应用程序包括C#、Razor和JSON.NET。我有一个C#对象,看起来像这样:

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

  public string Approach { get; set; }

  public object Value { get; set; }
}
List<MyBlueprint> x = new List<MyBlueprint>();
{
  new MyBlueprint { Name="Bill", Approach="straight", Value=1 },
  new MyBlueprint { Name="Bill", Approach="straight", Value=7 },
  new MyBlueprint { Name="Bill", Approach="straight", Value=10 },
  new MyBlueprint { Name="John", Approach="straight", Value=120 },
  new MyBlueprint { Name="John", Approach="straight", Value=105 },
  new MyBlueprint { Name="John", Approach="straight", Value=150 },
  new MyBlueprint { Name="John", Approach="straight", Value=100 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=1 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=2 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=5 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=8 }
};
var results = [
  { "name": "Bill", "approach":"straight", options: { begin: 1, end: 10 } },
  { "name": "John", "approach":"straight", options: { begin: 100, end: 150 } },
  { "name": "Jill", "approach":"curved", options: { chosen: [1, 2, 5, 8] } }
];
此时,我有一个
MyBlueprint
对象列表,如下所示:

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

  public string Approach { get; set; }

  public object Value { get; set; }
}
List<MyBlueprint> x = new List<MyBlueprint>();
{
  new MyBlueprint { Name="Bill", Approach="straight", Value=1 },
  new MyBlueprint { Name="Bill", Approach="straight", Value=7 },
  new MyBlueprint { Name="Bill", Approach="straight", Value=10 },
  new MyBlueprint { Name="John", Approach="straight", Value=120 },
  new MyBlueprint { Name="John", Approach="straight", Value=105 },
  new MyBlueprint { Name="John", Approach="straight", Value=150 },
  new MyBlueprint { Name="John", Approach="straight", Value=100 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=1 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=2 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=5 },
  new MyBlueprint { Name="Jill", Approach="curved", Value=8 }
};
var results = [
  { "name": "Bill", "approach":"straight", options: { begin: 1, end: 10 } },
  { "name": "John", "approach":"straight", options: { begin: 100, end: 150 } },
  { "name": "Jill", "approach":"curved", options: { chosen: [1, 2, 5, 8] } }
];
根据
方法的值,
选项
参数具有不同的属性。上面的JSON显示了两种不同的结构:
curve
stright
。我要更多。出于这个原因,我试图找出一种动态方法,而不创建大量的模型类。目前,我有以下几点:

var names = new[] { "Bill", "John", "Jill" };
foreach (var name in names)
{
  var blueprints = x.Where(y => y.Name == name).Select(z => z.Value.ToString());    
}

我知道如何获得
曲线
集合的
选择值列表。我知道如何获取
直线
集合的
开始
结束
值。然而,一旦我有了它们,我不知道该怎么办。我试图弄清楚如何创建一个动态C#对象,我可以将其序列化为JSON并将其放入视图中。我错过了什么?我觉得有点卡住了。

如果你愿意的话,你可以用匿名类型构建你想要的数据结构。假设您的“蓝图”存储在
myBluePrints
中:

var toBeSerialized = myBlueprints
    .GroupBy(bp => new {bp.Name, bp.Approach})
    .Select(bpg => new
    {
        name = bpg.Key.Name,
        approach = bpg.Key.Approach,
        options = new
        {
            begin = bpg.Min(bp => bp.Value),
            end = bpg.Max(bp => bp.Value)
        }
    });

也就是说,我认为构建它的最简单方法是只编写一个与
选项
相对应的类,以及一个与数组中顶级blueprint对象相对应的类。换句话说,您试图避免的“大量模型类”(特别是两个)可能是解决此问题的最简单方法。

我建议您必须执行以下操作

创建类

public class Options
{
    public Options()
    {
    }

    public Options(List<int> d,string approach)
    {
       if (approach == "straight")
       {
          begin = d.Min();
          end = d.Max();
       }
       else if (approach == "curved")
       {
           choosen = d.Select(cc => cc).ToArray();
       }
    }

    public int? begin { get; set; }
    public int? end { get; set; }
    public int[] choosen { get; set; }
}

这样做可能是最好的办法。