ASP.net Web API - 将数组名称添加到输出

时间:2013-01-22 04:24:16

标签: asp.net-mvc-4 asp.net-web-api

我正在尝试从Web API更改json输出。假设我有像People这样的对象,当前的输出将是:

[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]

但是我希望输出如下:

{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}

关于如何做到这一点的任何想法?

4 个答案:

答案 0 :(得分:14)

选项1 - 创建新模型

而不是返回

public IEnumerable<Person> Get()

返回

public People Get()

其中

public class People {
    public IEnumerable<Person> People {get; set;}
}

选项2 - 返回动态

而不是返回

public IEnumerable<Person> Get()

返回

public dynamic Get() {
    IEnumerable<Person> p = //initialize to something;
    return new {people = p};
}

选项3 - 修改JsonMediaTypeFormatter

你仍然可以返回

public IEnumerable<Person> Get()

但添加以下类:

public class PeopleAwareJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        if ((typeof (IEnumerable<People>).IsAssignableFrom(type)))
        {
            value = new {people = value};
        }
        return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
    }
}

现在在WebApiConfig中只注册新的格式化程序而不是旧的JSON:

config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new PeopleAwareMediaTypeFormatter());

答案 1 :(得分:2)

让我们假设列表对象的变量名是PersonList,它返回

[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]

您可以简单地按照以下方式返回,而不会感到痛苦

       return new
        {
            people = PersonList
        };

然后你会

{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}

答案 2 :(得分:0)

您必须拥有此DTO的{​​{1}}。所以,你要做的就是为你的阵列准备一个容器。

JSON

这是我假设你有这个json的DTO,因为你没有显示任何代码。

答案 3 :(得分:0)

基于Filip W的第二个选项,这很好地从数据库中提取,因为List实现了IEnumerable:

  

公共动态Get(){

List<Person> personList = new List<Person>();

using (DataTable dt = db.ExecuteDataTable("PeopleSelect")) {
    foreach (DataRow dr in dt.Rows) {
        personList.Add(new Person { name = (string)dr["name"], ...});
    }
}

return new { people = personList };
     

}