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,

Не стесняйтесь спрашивать, есть ли что-то непонятное для вас:)

Другие вопросы по тегам