C#对象部分转换为JSON(MVC)

时间:2012-09-12 01:08:35

标签: c# asp.net-mvc json

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

        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?

2 个答案:

答案 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