格式化JSON响应

时间:2014-01-04 03:28:15

标签: c# asp.net json

====摘要====

我需要一些帮助来尝试格式化我的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"
      }
    ]

3 个答案:

答案 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返回的结果,当我们填充响应对象的IDTitle字段时,由于调用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,以检查响应该行为刚刚返回时是否有错误。然后我就返回对象的状态使用CreateDynamicResponseCreateDynamicResponseFromException