2015-10-20 67 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

随意问你是否有什么不清楚的东西:)