MVC JsonConvert.SerializeObject - 如何获取列和数据行数组

时间:2014-03-01 18:08:23

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

我正在使用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);
    }

1 个答案:

答案 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);
}