C# 将带有多类型列表的json传递给web api
我希望能够将具有多类型列表的对象传递给web api调用,但似乎如果我不显式地声明属性,web api只会忽略数据 下面您可以看到,一个接口被用作占位符,以允许C#中的多类型列表,但似乎wehn将json字符串传递给web api,由于DTO不匹配,它没有映射值 Icoming DTO:C# 将带有多类型列表的json传递给web api,c#,json,asp.net-web-api2,dto,C#,Json,Asp.net Web Api2,Dto,我希望能够将具有多类型列表的对象传递给web api调用,但似乎如果我不显式地声明属性,web api只会忽略数据 下面您可以看到,一个接口被用作占位符,以允许C#中的多类型列表,但似乎wehn将json字符串传递给web api,由于DTO不匹配,它没有映射值 Icoming DTO: public class ValueCheckTestDto { public List<IValueCheckGroup> Groups { get; set; } } JSON字符串的
public class ValueCheckTestDto
{
public List<IValueCheckGroup> Groups { get; set; }
}
JSON字符串的更复杂版本
{
Groups: [{
Operator: "OR",
ValueCheckGroups: [{
Operator: "OR",
ValueCheckGroups: [{
AsocDataFieldID: 3,
Operand: "test string"
}]
},{
Operator: "AND",
ValueCheckGroups: [{
AsocDataFieldID: 4,
Operand: "test string 2"
}]
}]
}]
}
您试图传递到WebApi,但反序列化需要类型化结构
处理此问题的一种方法是将JObject
作为WebApi操作方法的参数:
public async Task<IHttpActionResult> Get(JObject q)
{
dynamic query = q; // cast to dynamic
foreach(var @group in query.Groups)
{
var op = @group.Operator; // or group["Operator"]
// do something
}
throw new NotImplementedException();
}
公共异步任务Get(JObject q)
{
dynamic query=q;//转换为dynamic
foreach(query.Groups中的var@group)
{
var op=@group.Operator;//或组[“Operator”]
//做点什么
}
抛出新的NotImplementedException();
}
您可能也可以编写一个自定义的JsonConverter。您需要创建一个自定义JsonConverter,如前所述 您的自定义转换器将如下所示
public class IValueCheckGroupCreationConverter : JsonCreationConverter<IValueCheckGroup>
{
protected override IValueCheckGroup Create(Type objectType, JObject jsonObject)
{
bool isExpression = jsonObject["AsocDataFieldID"] == null ? false : true;
if(isExpression) {
return new ValueCheckExpression ();
} else {
return new ValueCheck();
}
}
}
公共类IValueCheckGroupCreationConverter:JsonCreationConverter
{
受保护的覆盖IValueCheckGroup创建(类型objectType,JObject jsonObject)
{
bool isExpression=jsonObject[“asocatafieldid”]==null?false:true;
if(isExpression){
返回新的ValueCheckExpression();
}否则{
返回新的ValueCheck();
}
}
}
然后,您可以在手动调用JsonConvert.DeserializeObject或将此属性添加到“组”字段时使用转换器:[JsonConverter(typeof(IValueCheckGroupCreationConverter))]
public async Task<IHttpActionResult> Get(JObject q)
{
dynamic query = q; // cast to dynamic
foreach(var @group in query.Groups)
{
var op = @group.Operator; // or group["Operator"]
// do something
}
throw new NotImplementedException();
}
public class IValueCheckGroupCreationConverter : JsonCreationConverter<IValueCheckGroup>
{
protected override IValueCheckGroup Create(Type objectType, JObject jsonObject)
{
bool isExpression = jsonObject["AsocDataFieldID"] == null ? false : true;
if(isExpression) {
return new ValueCheckExpression ();
} else {
return new ValueCheck();
}
}
}