我正在尝试从Web API更改json输出。假设我有像People这样的对象,当前的输出将是:
[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]
但是我希望输出如下:
{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}
关于如何做到这一点的任何想法?
答案 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 };
}