【问题标题】:Can I manually hard code a JSON object to be returned by ASP.NET web API?我可以手动硬编码要由 ASP.NET Web API 返回的 JSON 对象吗?
【发布时间】:2015-06-23 05:40:33
【问题描述】:

我习惯于在 Django(类似于 Ruby on Rails)中执行此操作,在某些情况下,我需要硬编码 JSON 响应对象以便客户端能够解释,但我一直在网上到处搜索弄清楚如何使用 ASP.NET Web API 来做到这一点,但我在这方面找不到任何东西,ASP.NET Web API 似乎迫使我创建一个类来表示每个 URI 控制器的 JSON 响应。

例如,这是我所知道的手动创建 JSON 响应的唯一方法:

1.) 我首先需要创建类来表示响应对象

public class XYZ_JSON
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
}

2.) 然后我需要正确编写 URI 控制器,该控制器将返回我刚刚在上面定义的“XYZ_JSON”:

// GET: api/ReturnJSON
public XYZ_JSON Get()
{
    XYZ_JSON test = new XYZ_JSON { PropertyName = "Romulus", PropertyValue = "123123" };

    return test;
}

将产生类似以下内容的 http 响应:

200 正常 {"PropertyName":"Romulus", "PropertyValue":"123123"}

整个类到 JSON 的设计模式很酷,但它并没有帮助,而且在尝试将一个类作为其中包含许多类的 JSON 对象返回时实际上使事情变得更糟,例如:

public class XYZ_JSON
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
    public List<ComplexObject> objects { get; set; } // <- do not want
}

上面的 JSON 响应对象并没有那么复杂,但是对于我想要完成的事情,我必须将一个类列表放在一个类列表中的一个类列表中,我无法开发以这种尴尬的方式,除非我花一个星期在上面,这太荒谬了。

我需要能够以这种方式返回 JSON 响应:

// GET: api/ReturnJSON
public JSON_Response Get(string id)
{
    // do some SQL querying here to grab the model or what have you.

    if (somethingGoesWrong = true)
    return {"result":"fail"}
    else
    return {"result":"success","value":"some value goes here"}
}

上面的设计模式是我试图用 ASP.NET Web API 完成的,这是一种返回半硬编码 JSON 响应对象的非常简单的方法,它允许我从单个返回非常独特和动态的响应URI。将会有许多用例,其中将返回最多 8 个完全唯一的 Class 对象的列表。

另外,如果我想要完成的是倒退的做事方式,那也没关系。我已经发布了一个非常成功且稳定的 iOS 应用程序,它带有完美无瑕的 Django 后端服务器,以这种方式完美地处理事情,没有任何问题。

有人可以向我解释如何使用 ASP.NET Web API 返回一个简单的硬编码 JSON 响应吗?

谢谢!

【问题讨论】:

  • 旁白:你真的应该使用状态码。
  • 状态码是什么意思?@DanielA.White
  • http/rest 使用状态码来报告不同的情况。比如 404 表示找到的东西,但 200 表示结果。
  • @Legends HTTP status codes.

标签: c# asp.net json asp.net-mvc asp.net-web-api


【解决方案1】:

您可以在 C# 中创建 anonymous types,因此您可以使用其中之一来生成硬编码结果。例如:

return new JsonResult
{
    Data = new
    {
        result = "success",
        value = "some value"
    }
};

澄清一下,上面的代码是针对 ASP.NET MVC 的。如果您使用的是 Web API,那么您可以只返回数据对象,或使用 IHttpActionResult。匿名类型部分(new {})保持不变。

【讨论】:

  • @petelids 是的。如果您使用 Web API,您甚至不需要将其包装在 JsonResult 中,只需返回对象(或将其包装在 IHttpActionResult 中)
  • 如果Accept header是'application/xml',因为匿名对象不能被序列化,会不会失败?
  • 是的,如果客户端请求 XML,它将失败。这只是为了返回 JSON。 (但是,如果您确实知道使其适用于 XML 的方法,请将其添加到答案中)。
  • 有一个关于强制返回Json的问题here。我不会编辑你的答案,因为它是一个很好的答案,而且从它的声音来看,OP 可以控制调用者。
【解决方案2】:

使用匿名对象。

public object Get(string id)
{
    // do some SQL querying here to grab the model or what have you.

    if (somethingGoesWrong = true)
    return new {result = "fail"}
    else
    return new {result = "success", value= "some value goes here"}
}

【讨论】:

    【解决方案3】:
    // GET: api/ReturnJSON
    public JsonResult Get()
    {
       return Json(new {Property1 = "Valu1", Properrty2 = "Value2"});
    }
    

    您可以使用 JsonResult 类返回 json。并且 Json() 方法采用匿名对象,因此您无需创建类。

    【讨论】:

      【解决方案4】:

      您可以使用通用 JObject 来返回您的值,而无需构建完整的类结构,如下所示

      public JObject Get(int id)
          {
      
              return JsonConvert.DeserializeObject<JObject>(@"{""result"":""success"",""value"":""some value goes here""}");
      
      
          }
      

      【讨论】:

        【解决方案5】:

        对于硬编码响应,为什么不直接执行以下操作。返回的 JSON 内容不带引号。

            public HttpResponseMessage Get()
            {
                string content = "Your JSON content";
                return BuildResponseWithoutQuotationMarks(content);
            }
        
            private HttpResponseMessage BuildResponseWithoutQuotationMarks(string content)
            {
                var response = Request.CreateResponse(HttpStatusCode.OK);
                response.Content = new StringContent(content);
                return response;
            }
        
            private HttpResponseMessage BuildResponseWithQuotationMarks(string content)
            {
                var response = Request.CreateResponse(HttpStatusCode.OK, content);
                return response;
            }
        

        【讨论】:

        • 我的用例的最佳答案。
        • 这将返回为text/plain。如果您仍想以application/json 返回,则需要添加:response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2016-05-21
        • 2017-03-10
        • 1970-01-01
        • 2015-08-27
        相关资源
        最近更新 更多