簡體   English   中英

ASP.NET MVC4 Web API-控制返回的JSON格式,包括哪些內容?

[英]ASP.NET MVC4 Web API - Control over formatting of returned JSON and what is included?

我正在創建我的第一個ASP.NET MVC4 Web API。 我有一個包含約20個實體的數據庫,該實體已經創建並托管在Azure上,並使用Entity Framework將數據庫反向工程為POCO類。

他們最終看起來像這樣:

public class Activity
{
    public Activity()
    {
        this.ActivityCategories = new List<ActivityCategory>();
        this.ActivityImages = new List<ActivityImage>();
        this.PerformedActivities = new List<PerformedActivity>();
        this.UserActivities = new List<UserActivity>();
    }

    public int ActivityID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Nullable<int> Thumbnail { get; set; }
    public virtual Image Image { get; set; }
    public virtual ICollection<ActivityCategory> ActivityCategories { get; set; }
    public virtual ICollection<ActivityImage> ActivityImages { get; set; }
    public virtual ICollection<PerformedActivity> PerformedActivities { get; set; }
    public virtual ICollection<UserActivity> UserActivities { get; set; }
}

然后,我創建了一個ApiController擴展類,其動作如下:

    public IEnumerable<Activity> All()
    {
        return db.Activities.ToArray();
    }

而且,正如預期的那樣,它返回了很長的JSON回復。 JSON回復包含Activity類中定義的所有內容。 但是,如果我不想包含所有內容,該怎么辦? 例如,我不想返回諸如UserActivities,PerformedActivities等之類的東西。

基本上,我希望我的JSON看起來像:

[
    {
        "id":"32",
        "name":"this activity name",
        "description":"blah blah",
        "thumbnail":"http://mydomain.com/images/32/thumbnail.png",
        "images": [
            {
                "name":"this image",
                "url":"http://mydomain.com/images/32/1.png",
            },
            {
                "name":"cool image",
                "url":"http://mydomain.com/images/32/2.png",
            },
        ],
    },
    ...
]

(忽略JSON中的任何格式錯誤,只需非常快速地輸入示例即可)

注意,我也不必使用相同的屬性名稱。 有沒有一種有效的方法可以將數據整理成我想要的格式?

我的第一個想法是將每個活動復制到僅包含所需屬性的結構數組中。 有沒有更優雅的解決方案?

在這種情況下,DTO對象將為您提供幫助,DTO將為您的使用者提供足夠的數據,因此定義需要通過Web API傳輸數據的DTO。 在某些情況下,您可以通過EF使用模型,但是:

  1. 通常,EF會在后台生成動態代理,以支持延遲加載和跟蹤更改。 您可能會遇到的問題是序列化問題,因為Web API會序列化代理,而不是POCO對象。

  2. 向用戶傳輸過多不必要的數據將使HTTP請求變得繁重,並泄露數據泄漏。

  3. 違反關注點分離,當EF模型是域實體時,它們不承擔數據傳輸對象的責任。

在示例中,您可以定義ActivityDto ,並消除您提到的不必要的屬性:

public class ActivityDto
{
    public string Name { get; set; }
    public string Description { get; set; }
    public Nullable<int> Thumbnail { get; set; }
    public virtual Image Image { get; set; }
}

public IEnumerable<Activity> All()
{
    return db.Activities.Select(a => new ActivityDto(){
        Name = a.Name,
        Description = a.Description,
        Thumbnail = a.Thumbnail
        // More properties if you need

    }).ToArray();
}

如果您要尋找一種工具來自動將DTO映射到EF模型,請使用AutoMapper

在MVC中,實際上並不是將數據庫實體用作模型的最佳實踐,而是我將創建一個POCO(或更復雜的對象)作為ViewModel,然后再返回,該POCO僅包含視圖所需的數據(或本例中的API用戶)。 如果您只想操縱返回的數據,我不確定該怎么做,但是我知道WebAPI使用newtonsoft的JSON.NET庫輸出JSON,因此您將研究操縱它的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM