C# 格式化JSON响应

C# 格式化JSON响应,c#,asp.net,json,C#,Asp.net,Json,==摘要==== 我需要一些帮助来格式化我的JSON响应。我正在使用带有模型和控制器的ASP.Net ==信息==== 我正在ASP.Net中开发web api。我有一个SQL后端,在其中获取一些数据并将其放入DataTable。我的数据表如下所示: +----+-------+-------+ | ID | Title | Users | +----+-------+-------+ | 1 | Test | user1 | | 1 | Test | user2 | +----+---

==摘要====

我需要一些帮助来格式化我的JSON响应。我正在使用带有模型和控制器的ASP.Net

==信息====

我正在ASP.Net中开发web api。我有一个SQL后端,在其中获取一些数据并将其放入DataTable。我的数据表如下所示:

+----+-------+-------+ | ID | Title | Users | +----+-------+-------+ | 1 | Test | user1 | | 1 | Test | user2 | +----+-------+-------+ public class Record { public int ID { get; set; } public string Title {get; set;} public string Users {get; set;} } 注意:一条记录可以有多个用户,这就是为什么两行的ID都是1,ID不是实际SQL表行的唯一ID,而是一个外键…无论如何,我离题了

我用C创建了一个模型,如下所示:

+----+-------+-------+ | ID | Title | Users | +----+-------+-------+ | 1 | Test | user1 | | 1 | Test | user2 | +----+-------+-------+ 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" } ] ==问题====

如果可能的话,我如何让JSON响应看起来像这样:

{ "Response": [ { ID: 1, Title: "Test", Users: [ {name: "user1"}, {name: "user2"} ] } ] } 如果这是不可能的,那么这也很好:

"Response": [ { ID: 1, Title: "Test", Users: "user1" }, { ID: 1, Title: "Test", Users: "user2" } ]
您可以使用匿名对象返回自己的格式

请看这个:

public HttpResponseMessage Get()
{
    return this.Request.CreateResponse(
        HttpStatusCode.OK,
        new { Message = "Hello", Value = 123 });
} 

要扩展@Shahrooz-Jefri的答案,您可以返回一个HttpResponseMessage,该消息允许您返回一个匿名对象,但要按要求格式化结果,您需要修改get_Record方法:

使用这种方法,我们首先将调用db.GetRecord的结果转换为Record对象的IEnumerable


从那里,我们可以塑造一个匿名对象,以符合您的格式要求。请注意,在我的回答中,我没有应用任何错误检查;您应该这样做,因为db.GetRecord不返回任何结果,当我们填充响应对象的ID和Title字段时,由于对记录的调用,会导致异常。首先。

根据我目前的经验,创建通用响应将是您案例的最佳实践。例如,您可能有这样一个类

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与返回对象的状态相关

您需要一个名为Response的成员为Record类型数组的对象。至于漂亮的格式,我不确定。