我在控制器中有以下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
作为输出..意味着灭菌器无法使具体类产生消毒。
答案 0 :(得分:0)
发现问题。
发布我已设置
的对象时"$type": "MyNameSpace.SubNameSpace.ConcreteClass1"
需要将其设置为:
"$type": "MyNameSpace.SubNameSpace.ConcreteClass1, DLLName"
必须添加... ,DLLName
,因此它将是完全限定名称。