Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将带有多类型列表的json传递给web api_C#_Json_Asp.net Web Api2_Dto - Fatal编程技术网

C# 将带有多类型列表的json传递给web api

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字符串的

我希望能够将具有多类型列表的对象传递给web api调用,但似乎如果我不显式地声明属性,web api只会忽略数据

下面您可以看到,一个接口被用作占位符,以允许C#中的多类型列表,但似乎wehn将json字符串传递给web api,由于DTO不匹配,它没有映射值

Icoming DTO:

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();
            }   
        }
    }