ASP.NET Web API, возвращающий класс C#
В Web API Controller метод действия возвращает класс C#, например:
public class ShipController : ApiController
{
[HttpGet]
public Cell GetShip()
{
return new Cell(new ScriptEngine());
}
}
Где Cell - мой класс, унаследованный от ObjectInstance из библиотеки Jurassic JS. Когда я вызываю это действие, ASP.NET пытается сериализовать мой объект в XML или JSON, и я получаю System.InvalidOperationException
: "Типу ObjectContent`1'не удалось сериализовать тело ответа для типа контента" application/xml; charset=utf-8 "." Я также попытался добавить атрибуты [DataContract] в класс, как я нашел здесь, вот так:
[DataContract]
public class Cell : ObjectInstance
{
[DataMember]
public int cellId;
public Cell(ScriptEngine engine) : base(engine)
{
}
}
Но я все еще получаю ошибку. Как заставить действие вернуть только сериализованные мои поля класса, а не попасть в родительские классы?
1 ответ
Вы хотите сериализовать 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
,
Не стесняйтесь спрашивать, есть ли что-то непонятное для вас:)