目前我从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);
}
但我希望有更好的方法来做到这一点。 感谢。
答案 0 :(得分:0)
我的建议是:
感谢NewtonSoft.JSON反序列化此JSON(您可以通过NuGet Package Manager获取它)。
对象的数据处理。
较小代码段的示例:
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);