2013-01-17 65 views
1

我設置了一個WebApi控制器,該控制器應該返回一組不同類型的對象。請在我的虛設碼具有短期看:在Json中返回不同類型的對象

interface IDish 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
} 

class Steak : IDish 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string CookingStyle { get; set; } 
    public int Weight { get; set; } 
} 

class Soup : IDish 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class Dessert : IDish 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool ContainsSugar { get; set; } 
} 

public class DishController : ApiController 
{ 
    public IEnumerable<IDish> Get() 
    { 
     var dishes = busisnessLogic.GetDishes(); 
     return dishes; 
    } 
} 

正如你所看到的,在控制器中,我從我的業務邏輯檢索IDishes的集合。請不要太在意具體的課程。它們只是使樣本更容易在這裏解釋的樣本。真正的商業背景是完全不同的。

那麼,我的問題是什麼?當API控制器返回IDishes(在我的情況下爲Json)時,只有IDish接口的公共屬性被寫入Json輸出。

相反,我想將具體類的所有公共屬性寫入Json輸出。例如,如果IDish是「牛排」,我希望將其ID,名稱,CookingStyle和Weight寫出來。因此,只要ID和名稱是「湯」,並且ID,名稱和包含糖,如果它是「甜品」。

有沒有簡單的方法來實現這一目標?有時我往往沒有看到樹林前的樹...... ;-)

謝謝你們!

回答

1

我需要幾乎相同的功能,我認爲有2種方式去:

  1. 使用JSON.NET TypeNameHandling:
 

    var jsonFormatter = config.Formatters.JsonFormatter; 
    var jsonSerializerSettings = new JsonSerializerSettings(); 
    jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All; 
 

說明: https://github.com/ayoung/Newtonsoft.Json/blob/master/Newtonsoft.Json/TypeNameHandling.cs

  1. 如果你不希望你的.NET類型暴露在th e JSON輸出還有另一種選擇。

基本上,你需要做的是: - 創建您重寫Create方法來手動選擇您要創建 對象的類型從JsonCreationConverter派生的類 - 在你更新設置:

var jsonSerializerSettings = new JsonSerializerSettings(); 
jsonSerializerSettings.Converters.Add(new YourCustomJsonConverter()); 
jsonFormatter.SerializerSettings = jsonSerializerSettings; 

看看這篇文章,它描述一步一步來: http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

+0

喬安娜您好,我想先用簡單的方法去。你能告訴我在哪裏「配置」。來自?這是什麼類型或對象?謝謝你的幫助!!! – Ingmar

+1

@IngmarBode - 配置是一個'HttpConfiguration'對象,可用作'GlobalConfiguration.Configuration' –

+0

@Anna:Super!那是失蹤的一塊。我把你的第一個代碼片段放在我的global.asax中,現在一切都像魅力一樣工作。現在我的Json結果中有很多元數據,但我完全可以忍受。重要的是我現在在輸出中具有所有具體類的所有屬性。非常感謝喬安娜。這節省了我的一天:-) – Ingmar