1

我设置了一个 WebApi 控制器,它应该返回一组不同类型的对象。请看一下我的虚拟代码:

interface IDish
{
    int ID { get; set; }
    string Name { get; set; }
}

class Steak : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string CookingStyle { get; set; }
    public int Weight { get; set; }
}

class Soup : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Dessert : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool ContainsSugar { get; set; }
}

public class DishController : ApiController
{
    public IEnumerable<IDish> Get()
    {
        var dishes = busisnessLogic.GetDishes();
        return dishes;
    }
}

如您所见,在控制器中,我正在从业务逻辑中检索 IDish 的集合。请不要过多关注具体的类。它们只是示例,使这里的事情更容易解释。真实的商业背景完全不同。

那么,我的问题是什么?当 API 控制器返回 IDish(在我的例子中为 Json)时,只有 IDish 接口的公共属性被写入 Json 输出。

相反,我希望将具体类的所有公共属性写入 Json 输出。因此,例如,如果 IDish 是“牛排”,我想写出它的 ID、名称、烹饪风格和重量。因此,如果它是“汤”,则只有 ID 和名称,如果它是“甜点”,则只有 ID、名称和 ContainsSugar。

有没有简单的方法来实现这一目标?有时我往往看不到树林前的树木......;-)

多谢你们!

4

1 回答 1

1

我需要几乎相同的功能,我认为有两种方法:

  1. 使用 JSON.NET TypeNameHandling:

    var jsonFormatter = config.Formatters.JsonFormatter;
    var jsonSerializerSettings = new JsonSerializerSettings();
    jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;

说明: https ://github.com/ayoung/Newtonsoft.Json/blob/master/Newtonsoft.Json/TypeNameHandling.cs

  1. 如果您不希望在 JSON 输出中公开您的 .NET 类型,还有另一种选择。

基本上,您需要做的是: - 创建一个派生自 JsonCreationConverter 的类,在其中覆盖 Create 方法以手动选择要创建的对象的类型 - 您更新设置:

var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Add(new YourCustomJsonConverter());
jsonFormatter.SerializerSettings = jsonSerializerSettings;

查看这篇文章,它逐步描述它:http: //dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

于 2013-01-17T13:27:22.573 回答