【问题标题】:ASP.NET Web API returning C# classASP.NET Web API 返回 C# 类
【发布时间】:2015-10-20 16:22:18
【问题描述】:

在 Web API Controller 中的 action 方法返回 C# 类,像这样:

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

Cell 是我的类,继承自 Jurassic JS 库的 ObjectInstance。当我调用此操作时,ASP.NET 尝试将我的对象序列化为 XML 或 JSON,并且我得到 System.InvalidOperationException: "The 'ObjectContent`1' type failed to serialize response body for content type 'application/xml; charset= utf-8'。”我还尝试将 [DataContract] 属性添加到类,因为我发现 here,就像这样:

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

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

但我仍然得到错误。如何让操作只返回我序列化的类字段,而不是进入父类?

【问题讨论】:

  • 你能访问ObjectInstance代码吗?
  • 是的,它是here。用 [Serializable] 属性标记的类
  • 你能改吗?或者你只是使用它?
  • 我只是用它,它是一个开源库
  • This is 访问 /api/Ship 时得到的完整错误

标签: asp.net jurassic


【解决方案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

如果有不清楚的地方,请随时询问:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2015-01-05
    • 2018-07-17
    • 2021-09-24
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多