我在控制器中有以下代码。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime Birthday { get; set; }
}
public ActionResult JsonObject()
{
Person[] persons = new Person[]{
new Person{Name="John", Age=26, Birthday=new DateTime(1986,1,1)},
new Person{Name="Tom", Age=10, Birthday=new DateTime(2002, 1, 9)}
};
return Json(persons, JsonRequestBehavior.AllowGet);
}
通常,我得到的结果如下: [{ “名称”: “约翰”, “年龄”:26, “生日”: “/日期(504892800000)/”},{ “名称”: “汤姆”, “年龄”:10, “生日”:” /日期(1010505600000)/“}]
没关系,但是,我想为用户做一个选项:不显示生日。所以,期待的结果是这样的: [{ “名称”: “约翰”, “年龄”:26},{ “名称”: “汤姆”, “年龄”:10}]
如何不将Birthday属性序列化为JSON?
答案 0 :(得分:4)
您有两种选择:
1)将[ScriptIgnore]属性添加到Person类:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[ScriptIgnore]
public DateTime Birthday { get; set; }
}
2)返回一个只包含所需属性的匿名类型:
var toReturn = persons.Select(x => new {x.Name, x.Age});
return Json(toReturn, JsonRequestBehavior.AllowGet);
编辑:我不知道必须动态选择所需的列。您可以使用以下内容,因为Javascript中的对象和词典是相同的。
首先,创建一个扩展,创建所需属性的字典:
public static class JSONExtensions
{
public static IDictionary<string, object> ToJsonObject(this object instance, string[] includedProperties)
{
var jsonObject = new Dictionary<string, object>();
foreach (var property in instance.GetType().GetProperties())
{
if (includedProperties.Any(x=> x.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase)))
{
jsonObject[property.Name] = property.GetValue(instance);
}
}
return jsonObject;
}
}
接下来,在序列化之前使用此扩展方法:
var toReturn = persons.Select(x => x.ToJsonObject(desiredColumnss));
return Json(toReturn, JsonRequestBehavior.AllowGet);
答案 1 :(得分:0)
只需将新类定义为DTO,其中只包含必填字段。
public class PersonDTO
{
public string Name { get; set; }
public int Age { get; set; }
}
之后,您可以使用PersonDTO