====摘要====
我需要一些帮助来尝试格式化我的JSON响应。我正在使用带有模型和控制器的ASP.Net。
====信息====
我正在使用ASP.Net中的web api。我有一个SQL后端,我在其中获取一些数据并将其放入DataTable。我的DataTable看起来像这样:
+----+-------+-------+ | ID | Title | Users | +----+-------+-------+ | 1 | Test | user1 | | 1 | Test | user2 | +----+-------+-------+
注意:一条记录可以有多个用户,这就是两行的ID为“1”的原因(“ID”不是实际SQL表行的唯一ID,而是外键...无论如何,我离题了。 ..)
我在C#中创建了一个如下所示的模型:
public class Record { public int ID { get; set; } public string Title {get; set;} public string Users {get; set;} }
最后我的控制器看起来像这样
DataBaseHelper db = new DataBaseHelper(); public IEnumerable Get_Record(string id) { // Get DataTable DataTable dt = new DataTable(); dt = db.GetRecord(id); foreach (DataRow row in dt.Rows) { yield return new Record { ID = row.Field("ID"), Title = row.Field("Title"), Users = row.Field("Users") }; } }
当我调用API时,我得到了这个:
[ -{ ID: 1, Title: "Test", Users: "user1" }, -{ ID: 1, Title: "Test", Users: "user2" } ]
==== QUESTION ====
如何让JSON响应看起来像这样(如果可能的话):
{ "Response": [ { ID: 1, Title: "Test", Users: [ {name: "user1"}, {name: "user2"} ] } ] }
如果不可能,那么这也很好:
"Response": [ { ID: 1, Title: "Test", Users: "user1" }, { ID: 1, Title: "Test", Users: "user2" } ]
答案 0 :(得分:0)
您可以使用匿名对象返回自己的格式。
请看这个:
public HttpResponseMessage Get()
{
return this.Request.CreateResponse(
HttpStatusCode.OK,
new { Message = "Hello", Value = 123 });
}
答案 1 :(得分:0)
要扩展@Shahrooz Jefri的答案,您可以返回HttpResponseMessage
,这将允许您返回匿名对象,但要根据需要格式化结果,您需要修改Get_Record
方法:
public HttpResponseMessage Get_Record(string id)
{
// Get DataTable
DataTable dt = new DataTable();
dt = db.GetRecord(id);
var records = dt.Rows.Select(r => new Record()
{
ID = row.Field("ID"),
Title = row.Field("Title"),
Users = row.Field("Users")
});
return this.Request.CreateResponse(HttpStatusCode.OK,
new
{
Response = new
{
ID = records.First().ID,
Title = records.First().Title,
Users = records.Select(r => r.Users)
}
});
}
通过这种方法,我们首先将调用结果从db.GetRecord
转换为IEnumerable<Record>
对象的Record
。
从那里,我们可以塑造一个匿名对象以匹配您的格式要求。请注意,在我的回答中,我没有应用任何错误检查;你应该,db.GetRecord
返回的结果,当我们填充响应对象的ID
和Title
字段时,由于调用records.First()
而没有结果会导致异常。< / p>
答案 2 :(得分:0)
嗯,到目前为止我所经历的,创建一般回复将是您案例的最佳实践。例如,你可能有类似这样的课程。
public enum Status
{
OK = 1,
ERROR = -1,
}
public class ResponseDTO
{
public static ResponseDTO CreateDynamicResponse(object content)
{
return new ResponseDTO {Status = Status.OK, Content = content};
}
public static ResponseDTO CreateDynamicResponseFromException(RovlerBaseException ex)
{
return new ResponseDTO
{
Status = Status.ERROR,
Message = ex.Message,
};
}
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public Status Status;
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public object Content { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Message { get; set; }
}
执行操作后,我创建一个ActionFilterAttribute,以检查响应该行为刚刚返回时是否有错误。然后我就返回对象的状态使用CreateDynamicResponse
或CreateDynamicResponseFromException
。