我正在使用JsonConvert.SerializeObject序列化带MVC5的viewmodel,结果是每个记录的数组(例如[{PropertyName:Value,...},{PropertyName:Value,...我正在尝试填充一个光滑的网格以动态获取属性名称,我看到其他人的数组在一个数组中有属性名,然后在另一个数组中有数据行。如何创建[{Column Names}}, {DataRowValues}]所以我可以从这个数组中获取属性名称。我也将反序列化这些数据。我使用这个链接作为参考,但我使用的是List并且无法使其工作Formatting output of Newtonsoft.Json.JsonConvert.SerializeObject(dataSet)谢谢。
[HttpGet]
public JsonResult GeneratePlans()
{
//code here to create and populate view model
return Json(JsonConvert.SerializeObject(viewModel, Formatting.Indented, new JsonSerializerSettings { }), JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:0)
在服务器上,如果需要动态属性解析,可以使用反射来枚举视图模型的属性和值。
由于您希望将JSON拆分为属性名称的数组和属性值的数组,因此我们需要一个类来保存该结果。我故意简单地离开了这个类,因为它只用于保存JSON序列化的值。
class ObjectPropertyNamesAndValues
{
public List<string> Names { get; set; }
public List<object> Values { get; set; }
}
这是一个函数,它将在给定任何类型的ObjectPropertyNamesAndValues
实例的情况下填充viewModel
的实例。
ObjectPropertyNamesAndValues GetObjectPropertyNamesAndValues(object viewModel)
{
if (viewModel == null)
return null;
var result = new JsonObjectPropertyValues();
result.Names = new List<string>();
result.Values = new List<object>();
var propertyInfo = viewModel.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in propertyInfo)
{
if (!propertyInfo.CanRead)
continue;
// you can add other checks here, too, such as whether or not
// the property has a certain custom attribute or not
result.Names.Add(propertyInfo.Name);
result.Values.Add(property.GetValue(viewModel));
}
return result;
}
现在您可以像这样实现您的功能:
[HttpGet]
public JsonResult GeneratePlans()
{
//code here to create and populate view model
// get the object properties and values for transport as JSON
Debug.Assert(viewModel != null);
var objectPropertyNamesAndValues = GetObjectPropertyNamesAndValues(viewModel);
return Json(JsonConvert.SerializeObject(objectPropertyNamesAndValues, Formatting.Indented, new JsonSerializerSettings { }), JsonRequestBehavior.AllowGet);
}