1

我在控制器中有以下代码。

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

通常,我得到这样的结果: [{"Name":"John","Age":26,"Birthday":"/Date(504892800000)/"},{"Name":"Tom","Age ":10,"生日":"/日期(1010505600000)/"}]

没关系,但是,我想为用户做一个选项:不显示生日。因此,预期结果将是这样的: [{"Name":"John","Age":26},{"Name":"Tom","Age":10}]

如何不将生日属性序列化为 JSON?

4

2 回答 2

3

你有两个选择:

1) 在 Person 类中添加 [ScriptIgnore] 属性:

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);
于 2012-09-12T01:19:36.297 回答
0

只需定义一个新类作为 DTO,它只包含必填字段。

public class PersonDTO
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

之后,您可以 PersonDTO

于 2012-09-12T01:20:29.850 回答