在WebAPI中接收抽象类型作为输入

时间:2016-11-21 08:45:34

标签: json asp.net-web-api asp.net-web-api2 jsonserializer

我在控制器中有以下WebAPI操作(示例):

public MyAbstractClass Action1(MyAbstractClass input)
{
    return input;
}

类结构如下:

public class MyAbstractClass 
{
   public int ID {get;set;}
   public string Name {get;set;}
}

public class ConcreteClass1 : MyAbstractClass 
{
   public string Foo {get;set;}
}

public class ConcreteClass1 : MyAbstractClass 
{
   public string Bar {get;set;}
}

我想用一个描述其中一个具体类的JSON来调用WebAPI Action1,但它总是返回null。

我已经设置了这样的格式化程序:

public static void Configure(MediaTypeFormatterCollection formatters)
{
    var jsonFormatter = formatters.JsonFormatter;
    var settings = jsonFormatter.SerializerSettings;

    settings.Formatting = Formatting.Indented;
    settings.TypeNameHandling = TypeNameHandling.Objects;
    settings.ContractResolver = new CamelCaseExceptDictionaryKeysResolver();
}

private class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver
{
    protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
    {
        JsonDictionaryContract contract = base.CreateDictionaryContract(objectType);

        contract.DictionaryKeyResolver = propertyName => propertyName;

        return contract;
    }
}

注意我有一个自定义解析器,我已设置settings.TypeNameHandling = TypeNameHandling.Objects;

所以我发送一个JSON的帖子请求,如下所示:

{
   "$type": "MyNameSpace.SubNameSpace.ConcreteClass1"
   "id":100,
   "name":"some name",
   "foo":"some value of foo..."
}

然后接收null作为输出..意味着灭菌器无法使具体类产生消毒。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

发现问题。

发布我已设置

的对象时
"$type": "MyNameSpace.SubNameSpace.ConcreteClass1"

需要将其设置为:

"$type": "MyNameSpace.SubNameSpace.ConcreteClass1, DLLName"

必须添加... ,DLLName,因此它将是完全限定名称。