从Web方法动态返回字段

时间:2018-02-08 13:32:46

标签: c# json asp.net-core

我有一个WebAPI服务,我希望允许用户指定他们想要返回的字段。例如,假设我有以下Person类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

并且调用/api/people/会返回所有人的所有三个字段。如何处理像/api/people?fields=FirstName,Email这样的请求,为所有人返回这两个字段?如果我可以将first_name映射到FirstName,但不需要,则可以获得奖励积分。

2 个答案:

答案 0 :(得分:2)

这是Dynamic Language Runtime的工作,特别是ExpandoObject,您只需返回运行时确定的所需的属性

public dynamic GetPerson()
{
    bool firstNameRequired = true; // TODO: Parse querystring
    bool lastNameRequired = false; // TODO: Parse querystring

    dynamic rtn = new ExpandoObject();

    if (firstNameRequired)
        rtn.first_name = "Steve";

    if (lastNameRequired)
        rtn.last_name = "Jobs";

    // ... and so on

    return rtn;
}

void Main()
{
    // Using the serializer of your choice:
    Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(GetPerson()));
}

输出:

  

{"如first_name":"史蒂夫"}

我现在没有办法测试它[我在vanilla Web API上有类似的东西,有大量可选字段],但是通过.NET Core docs web方法会看起来像这样但没有硬编码值!:

[HttpGet()]
public IActionResult Get([FromQuery(Name = "fields")] string fields)
{
    var fieldsOptions = fields.Split(',');

    dynamic rtn = new ExpandoObject();

    if (fieldsOptions.Contains("FirstName"))
        rtn.first_name = "Steve";

    if (fieldsOptions.Contains("LastName"))
        rtn.last_name = "Jobs";

    if (fieldsOptions.Contains("Email"))
        rtn.email = "steve@apple.com";

    return new ObjectResult(rtn);
}

您需要引用System.Dynamic.Runtime包。

答案 1 :(得分:1)

您可以使用conditional serialization。您只需将ShouldSerialize返回值基于fields参数是否包含标识该字段的字符串。这适用于您想要与字段关联的任何字符串。如果需要,您甚至可以为每个字段接受多个字符串。

要将fieldList放入要序列化的对象(Person)中,您只需将它或包含它的内容(HttpRequest.Query或某些自定义Options类)传递给构造函数即可。

public bool ShouldSerializeFirstName(){  
    return fieldList.Contains("FirstName");            
}