将具有列名称的数据表转换为JSON

时间:2018-05-02 15:17:46

标签: c# json

目前我从SQL SP获取数据表,其中一列具有我要查找的字段的值。

例如:

 [{
    "Date": "2018-04-30",
    "Office_ID": "0001",
    "Metric_Name": "Hours_Worked",
    "Actual_Value": "25",
    "Goal_Value": "100",
    "Actual_Percent": "25%",
    "Goal_Percent": "50%",
    "Actual_Points": "1",
    "Goal_Points": "5"
  },
  {
    "Date": "2018-04-30",
    "Office_ID": "0001",
    "Metric_Name": "Projects_Worked",
    "Actual_Value": "5",
    "Goal_Value": "10",
    "Actual_Percent": "50%",
    "Goal_Percent": "50%",
    "Actual_Points": "5",
    "Goal_Points": "5"
  },
  {
    "Date": "2018-04-30",
    "Office_ID": "0002",
    "Metric_Name": "Hours_Worked",
    "Actual_Value": "75",
    "Goal_Value": "100",
    "Actual_Percent": "75%",
    "Goal_Percent": "50%",
    "Actual_Points": "5",
    "Goal_Points": "5"
  },
  {
    "Date": "2018-04-30",
    "Office_ID": "0002",
    "Metric_Name": "Projects_Worked",
    "Actual_Value": "10",
    "Goal_Value": "10",
    "Actual_Percent": "100%",
    "Goal_Percent": "50%",
    "Actual_Points": "5",
    "Goal_Points": "5"
  }]

我希望将Metric_Name字段中的值用作字段名称本身,并将所有度量标准信息标记给它。我想尝试下面的JSON:

[{"Office_ID": "0001",
  "Date": "2018-04-30",
  "Hours_Worked": {"Actual_Value": "25",
                   "Goal_Value": "100",
                   "Actual_Percent": "25%",
                   "Goal_Percent": "50%",
                   "Actual_Points": "1",
                   "Goal_Points": "5"
                  },
  "Projects_Worked": {"Actual_Value": "5",
                      "Goal_Value": "10",
                      "Actual_Percent": "50%",
                      "Goal_Percent": "50%",
                      "Actual_Points": "5",
                      "Goal_Points": "5"
                     }
 },
 {"Office_ID": "0002",
  "Date": "2018-04-30",
  "Hours_Worked": {"Actual_Value": "75",
                   "Goal_Value": "100",
                   "Actual_Percent": "75%",
                   "Goal_Percent": "50%",
                   "Actual_Points": "5",
                   "Goal_Points": "5"
                  },
  "Projects_Worked": {"Actual_Value": "10",
                      "Goal_Value": "10",
                      "Actual_Percent": "100%",
                      "Goal_Percent": "50%",
                      "Actual_Points": "5",
                      "Goal_Points": "5"
                     }
 }]

我试图在C#中实现它。希望这是可能的。

目前我正在使用一种解决方法来遍历所有值并执行下面的操作,其中我已经为每个度量值定义了一个包含字段的PerformanceModel:

 foreach (var item in result.Select( x=>x.Office_ID).Distinct())
            {
                PerformanceModel _performancemetric = new PerformanceModel();
                foreach (var metric in result.Where(y => y.Office_ID == item))
                {
                    _performancemetric.Office_ID = metric.Office_ID;
                    _performancemetric.Date = metric.Date;
                    switch(metric.Metric_Name)
                    {
                        case "Hours_Worked":
                            _performancemetric.Hours_Worked_Actual_Value = Int32.Parse(metric.Actual_Value,0);
                            _performancemetric.Hours_Worked_Goal_Value = Int32.Parse(metric.Goal_Value,0);
                            _performancemetric.Hours_Worked_Goal_Point = metric.Goal_Points;
                            _performancemetric.Hours_Worked_Actual_Point = metric.Actual_Points;
                            _performancemetric.Hours_Worked_Goal_Percent = metric.Goal_Percent;
                            _performancemetric.Hours_Worked_Actual_Percent = metric.Actual_Percent;
                            break;
                        case "Projects_Worked":
                            _performancemetric.Projects_Worked_Actual_Value = Int32.Parse(metric.Actual_Value,0);
                            _performancemetric.Projects_Worked_Goal_Value = Int32.Parse(metric.Goal_Value,0);
                            _performancemetric.Projects_Worked_Goal_Point = metric.Goal_Points;
                            _performancemetric.Projects_Worked_Actual_Point = metric.Actual_Points;
                            _performancemetric.Projects_Worked_Goal_Percent = metric.Goal_Percent;
                            _performancemetric.Projects_Worked_Actual_Percent = metric.Actual_Percent;
                            break;
                    }
                }
 _performancelist.Add(_performancemetric);
        }

但我希望有更好的方法来做到这一点。 感谢。

1 个答案:

答案 0 :(得分:0)

我的建议是:

  1. 感谢NewtonSoft.JSON反序列化此JSON(您可以通过NuGet Package Manager获取它)。

  2. 对象的数据处理。

  3. 将生成的对象序列化为JSON。
  4. 较小代码段的示例:

    public class Container
    {
        public DateTime Date { get; }
        public string OfficeId { get; }
        public string Metric_Name { get; }
    
        // the following is when you want to add nested objects in your json
        public AContent AContent { get; }
    
        // ...
    
        public class AContent
        {
            // whatever you want
        }
    
        /// <summary>
        /// Creates a new object from the json.
        /// </summary>
        /// <param name="json">The json as a string.</param>
        /// <returns></returns>
        public static Container FromJson(string json)
        {
            try
            {
                return JsonConvert.DeserializeObject<Container>(json);
            }
            catch (JsonException e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    
        /// <summary>
        /// Transforms this to a json string
        /// </summary>
        /// <returns></returns>
        public string ToJson()
        {
            try
            {
                return JsonConvert.SerializeObject(this);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
    }
    

    顺便说一下,我看到你的JSON是一个列表。因此,您可能希望直接序列化List,例如:

    return JsonConvert.DeserializeObject<List<Container>>(json);