【问题标题】:Formatting JSON response格式化 JSON 响应
【发布时间】:2014-01-21 21:07:15
【问题描述】:

====总结====

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

====信息====

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

+----+-------+-------+ |身份证 |标题 |用户 | +----+-------+-------+ | 1 |测试 |用户1 | | 1 |测试 |用户2 | +----+-------+-------+

注意:一条记录​​可以有多个用户,这就是为什么两行的 ID 都是“1”的原因(“ID”不是实际 SQL 表行的唯一 ID,而是外键......无论如何,我离题了。 ..)

我在 C# 中创建了一个如下所示的模型:

公开课记录 { 公共 int ID { 获取;放; } 公共字符串标题 {get;放;} 公共字符串用户{get;放;} }

最后我的控制器看起来像这样

DataBaseHelper db = new DataBaseHelper(); 公共 IEnumerable Get_Record(字符串 id) { // 获取数据表 数据表 dt = 新数据表(); dt = db.GetRecord(id); foreach(dt.Rows 中的 DataRow 行) { 收益回报新纪录 { ID = row.Field("ID"), 标题 = row.Field("标题"), 用户 = row.Field("用户") }; } }

当我调用 API 时,我得到了这个:

[ -{ 编号:1, 标题:“测试”, 用户:“user1” }, -{ 编号:1, 标题:“测试”, 用户:“user2” } ]

====问题====

如何让 JSON 响应看起来像这样(如果可能):

{ “回复”: [ { 编号:1, 标题:“测试”, 用户: [ {名称:“user1”}, {名称:“user2”} ] } ] }

如果这是不可能的,那么这也很棒:

“回复”: [ { 编号:1, 标题:“测试”, 用户:“user1” }, { 编号:1, 标题:“测试”, 用户:“user2” } ]

【问题讨论】:

  • 您需要一个具有名为“Response”的成员的对象,该成员是Record 类型的数组。至于漂亮的格式,不确定。

标签: c# asp.net json


【解决方案1】:

要扩展@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 的结果转换为您的Record 对象的IEnumerable<Record>

从那里,我们可以塑造一个匿名对象以满足您的格式要求。请注意,在我的回答中,我没有应用任何错误检查;你应该这样做,因为db.GetRecord 没有返回结果,当我们填充响应对象的IDTitle 字段时,由于调用records.First(),将导致异常。

【讨论】:

    【解决方案2】:

    您可以使用匿名对象返回自己的格式。

    请看这个:

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

    【讨论】:

      【解决方案3】:

      嗯,到目前为止,我所经历的情况是,创建通用响应将是您的案例的最佳实践。例如,您可能有一个类似这样的类。

      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 以检查该操作刚刚返回的响应是否有错误。然后我就返回对象的状态使用CreateDynamicResponseCreateDynamicResponseFromException

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        相关资源
        最近更新 更多