Interface 返回Json中不同类型的对象

Interface 返回Json中不同类型的对象,interface,asp.net-web-api,json.net,Interface,Asp.net Web Api,Json.net,我设置了一个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; se

我设置了一个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
{
int ID{get;set;}
字符串名称{get;set;}
}
等级:IDish
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串CookingStyle{get;set;}
公共整数权重{get;set;}
}
班级:伊迪什
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
班级甜点:伊迪什
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共bool包含sgar{get;set;}
}
公共类控制器:ApiController
{
公共IEnumerable Get()
{
var disks=businesslogic.getdisks();
还菜;
}
}
如您所见,在控制器中,我从业务逻辑中检索IDish集合。请不要太注意具体的课程。它们只是一些示例,以便在这里更容易解释。真正的商业背景完全不同

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

相反,我希望将具体类的所有公共属性写入Json输出。所以,举个例子,如果IDish是“牛排”,我想把它的ID、名字、烹饪方式和重量写出来。因此,如果是“汤”,则只需输入ID和名称;如果是“甜点”,则输入ID、名称和内容

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


谢谢大家

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

  • 使用JSON.NET TypeNameHandling:
  • 说明:

  • 如果您不希望.NET类型在JSON输出中公开,还有另一个选项
  • 基本上,您需要做的是: -创建一个从JsonCreationConverter派生的类,在该类中重写create方法以手动选择要创建的对象的类型 -要更新设置,请执行以下操作:

    var jsonSerializerSettings = new JsonSerializerSettings();
    jsonSerializerSettings.Converters.Add(new YourCustomJsonConverter());
    jsonFormatter.SerializerSettings = jsonSerializerSettings;
    
    查看这篇文章,它一步一步地描述:

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

  • 使用JSON.NET TypeNameHandling:
  • 说明:

  • 如果您不希望.NET类型在JSON输出中公开,还有另一个选项
  • 基本上,您需要做的是: -创建一个从JsonCreationConverter派生的类,在该类中重写create方法以手动选择要创建的对象的类型 -要更新设置,请执行以下操作:

    var jsonSerializerSettings = new JsonSerializerSettings();
    jsonSerializerSettings.Converters.Add(new YourCustomJsonConverter());
    jsonFormatter.SerializerSettings = jsonSerializerSettings;
    
    查看这篇文章,它一步一步地描述:

    嗨,乔安娜,我想先用简单的方法。你能告诉我“配置”是从哪里来的吗?那是什么类型或对象?谢谢你的帮助@IngmarBode-配置是一个
    HttpConfiguration
    对象,可作为
    GlobalConfiguration.Configuration
    @Anna:Super!那是丢失的一块。我将您的第一个代码片段放在my global.asax中,现在一切都很顺利。现在我的Json结果中有很多元数据,但我完全可以接受。重要的是,我现在在输出中拥有了我的具体类的所有属性。非常感谢你,乔安娜。这节省了我的时间:-)顺便说一下,新的/额外的元数据如下所示。也许我也可以轻松地关掉它?{“$type”:“System.Collections.Generic.List`1[[myProject.Interfaces.IDish,myProject.Core]],mscorlib“,“$values”:[{“$type”:"myProject.Entities.Steak,…@IngmarBode-不,这是typeNameHandling的要点-json.net保存类型以便能够在反序列化过程中实例化正确的对象类型。但是,您可以尝试将其设置为
    typeNameHandling.Auto
    而不是
    typeNameHandling.All
    ,然后json.net应仅为不同于基类型的e类型。不过我会检查嵌套类型是如何工作的。嗨,乔安娜,我想先用简单的方法。你能告诉我“配置”在哪里吗来自?那是什么类型或对象?谢谢你的帮助!!!@IngmarBode-配置是一个
    HttpConfiguration
    对象,可以作为
    GlobalConfiguration.Configuration.Configuration
    @Anna:Super!那是缺少的部分。我把你的第一个代码片段放在了我的global.asax中,现在一切都像一个魔咒一样工作了。我确实有很多方法现在我的Json结果中有一个数据,但我完全可以接受。重要的是,我现在在输出中有我的具体类的所有属性。非常感谢你,Joanna。这节省了我的时间:-)顺便说一下,新的/额外的元数据看起来是这样的。也许我也可以轻松地关闭它?{“$type”:“System.Collections.Generic.List`1[[myProject.Interfaces.IDish,myProject.Core]],mscorlib“,“$values”:[{“$type”:"myProject.Entities.Steak,…@IngmarBode-不,这是typeNameHandling的要点-json.net保存类型以便能够在反序列化过程中实例化正确的对象类型。但是,您可以尝试将其设置为
    typeNameHandling.Auto
    而不是
    typeNameHandling.All
    ,然后json.net应仅为不同于基类型的e类型。不过,我会检查嵌套类型是如何工作的。