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、"誕生日 ":" / Date(1010505600000)/ "}]

それは大丈夫です、しかし、私はユーザーのために誕生日を表示しないというオプションを作りたいです。したがって、期待される結果は次のようになります。[{"Name": "John"、 "Age":26}、{"Name": "Tom"、 "Age":10}]

誕生日プロパティをJSONにシリアル化しないようにするにはどうすればよいですか?

4

2 に答える 2

3

2つのオプションがあります。

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);
于 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 に答える