如何让C# Web API仅返回值而非键
解决方案
要实现只返回值而非键的JSON结构,你需要放弃直接返回DataSet或强类型对象(比如你的Roles类),因为它们序列化后会自动带上列名/属性名。可以按以下步骤修改代码:
- 构建值集合:把DataRow中的字段值按顺序存入
object[]数组,再收集到列表中 - 包装返回结构:用匿名类包裹这个列表,保持外层的"Role"键
修改后的控制器代码示例:
public HttpResponseMessage Get() { // 省略数据库连接、查询代码 DataSet ds = new DataSet(); sda.Fill(ds, "Role"); List<object[]> roleValues = new List<object[]>(); foreach (DataRow drow in ds.Tables[0].Rows) { // 处理Department的空值 var department = drow["Department"] == DBNull.Value ? "No Department" : drow["Department"].ToString(); // 按顺序把字段值存入数组 roleValues.Add(new object[] { drow["PersonName"], drow["UserName"], drow["Profile"], drow["Level"], Convert.ToInt32(drow["Year"]), department }); } // 返回匿名对象,外层保留"Role"键 return Request.CreateResponse(HttpStatusCode.OK, new { Role = roleValues }); }
说明:
- 你期望的示例中用
{}包裹值是不符合JSON规范的,JSON对象必须包含键值对,所以正确的结构应该是用[](数组)来存储每一行的值,最终返回的JSON会是这样:
{ "Role": [ ["Test, Student1", "12345", "STUDENT", "UN", 1, "No Department"], ["Test, Student2", "678910", "STUDENT", "UN", 1, "No Department"] ] }
- 如果坚持要类似对象的格式(但JSON不允许无键对象),会导致前端解析异常,不建议这么做。
内容的提问来源于stack exchange,提问作者GBM
相关产品推荐
相关产品推荐

