2015-10-20 66 views
0

在網頁API控制器操作方法返回的C#類,這樣的:的ASP.NET Web API返回的C#類

public class ShipController : ApiController 
{ 
    [HttpGet] 
    public Cell GetShip() 
    { 
     return new Cell(new ScriptEngine()); 
    } 
} 

其中單元爲我的課,從ObjectInstance繼承了侏羅紀JS庫。當我調用這個動作時,ASP.NET會嘗試將我的對象序列化爲XML或JSON,並且我得到System.InvalidOperationException:''ObjectContent`1'類型未能序列化內容類型'application/xml; charset = utf- 8' 。」我也嘗試添加屬性[DataContract]類,因爲我發現here,這樣的:

[DataContract] 
public class Cell : ObjectInstance 
{ 
    [DataMember] 
    public int cellId; 

    public Cell(ScriptEngine engine) : base(engine) 
    { 
    } 
} 

但我仍然得到錯誤。如何使動作只返回我的類的字段序列化,而不是進入父類?

+1

你可以訪問'ObjectInstance'代碼嗎? – AnhTriet

+0

是的,它是[這裏](https://jurassic.codeplex.com/SourceControl/latest#Jurassic/Library/Object/ObjectInstance.cs)。標有[Serializable]屬性的類 – Glavak

+0

您可以更改它嗎?或者你只是用它? – AnhTriet

回答

0

你只想序列化Cell類,而不是它的父類,對吧?解決方案是:創建一個定製的JSON轉換器。下面是代碼:

Cell.cs

[JsonConverter(typeof(CellJsonConverter))] 
public class Cell : Parent 
{ 
    public int CellId { get; set; } 
    public string Name { get; set; } 

    public Cell(int id) : base(id) 
    { 
     CellId = id; 
     Name = "This is a name"; 
    } 
} 

CellJsonConverter.cs

public class CellJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var cell = (Cell) value; 

     writer.WriteStartObject(); 

     writer.WritePropertyName("cellId"); 
     serializer.Serialize(writer, cell.CellId); 

     writer.WritePropertyName("name"); 
     serializer.Serialize(writer, cell.Name); 

     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Cell); 
    } 
} 

當你打電話給你的API,你將獲得:{"cellId":10,"name":"This is a name"}

JsonConverter來自Newtonsoft.Json

隨意問你是否有什麼不清楚的東西:)