【问题标题】:C# Web service, how to receive JSONC# Web 服务,如何接收 JSON
【发布时间】:2012-07-17 01:25:38
【问题描述】:

我用 jquery 制作了一个 JSON 字符串,我想将它发送到 C# web api 控制器。

这是 JSON 对象的示例

{"Name":"","Type":"4","Meals":["2","3"],"Excludes":["Beef","Chicken"]}

我尝试使用这样的 URL 发送它

API/Recipe/Search?json={"Name":"","Type":"4","Meals":["2","3"],"Excludes":["Beef","Chicken"]}

像这样使用我的控制器:

public class RecipeController : ApiController
{

    [HttpGet]
    public string Search(searchObject json)
    {
        return "Asdasd";
    }
 }

像这样

   public class RecipeController : ApiController
{

    [HttpGet]
    public string Search(string json)
    {
        searchObject search = (searchObject)JsonConvert.DeserializeObject(json);

        return "Asdasd";
    }
}

但在任何情况下,控制器都不会拾取它。我正在使用 MVC4。

这是我用来拨打电话的 Jquery。 apiLink 是我上面贴的链接。

$.getJSON(apiLink, function (data) {
        var items = [];

        $.each(data, function (key, val) {
            items.push('<li id="' + key + '">' + val + '</li>');
        });

        $('<ul/>', {
            'class': 'my-new-list',
            html: items.join('')
        }).appendTo('body');
    });

如何让控制器接收 JSON 对象?

谢谢

【问题讨论】:

  • 你打开你是用jQuery来调用你的动作吗?
  • 是的。我现在将在原始帖子中编辑我的 jquery 代码。 firebug 显示该链接是一个 http 错误 400 错误请求。

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


【解决方案1】:

您应该在方法中使用 POST 属性,这样您就可以将复杂的对象发布到 Web API,

您可以为 JSON 创建一个类,来自 json to cSharp

public class SearchObject
{
    public string Name { get; set; }
    public string Type { get; set; }
    public List<string> Meals { get; set; }
    public List<string> Excludes { get; set; }
}

然后在您的 Web api 中,使用 HttpPost 属性指定方法,Web API 将负责将 post 中的 json 反序列化到您的模板。

[HttpPost]
public string Search(SearchObject json)
{
    return "Asdasd";
}

您可以尝试 fiddler,用于发出 post 请求,在请求标头中指定类型:

内容类型:应用程序/json

并在请求正文中粘贴您的 json,然后执行

【讨论】:

    【解决方案2】:

    看起来您已经收到了回复,但这里是有效解决方案的代码:

    注意:我在MVC3中使用了JsonResult Actions,但是原理是一样的

    控制器:

        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            public ActionResult Index()
            {
                return View();
            }
    
            [HttpPost] // requires HttpPost attribute
            public JsonResult SendData(SearchObject payload)
            {
                // do something here
    
                return Json(new { status = "Success" });
            }
        }
    
        public class SearchObject
        {
            public string Name { get; set; }
            public string Type { get; set; }
            public List<string> Meals { get; set; }
        }
    

    查看:

    @{
        ViewBag.Title = "Index";
    }
    <script src="../../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $.ajaxSetup({ accepts: "application/json" });
        $.ajax({
            url: '@Url.Action("SendData")', type: "POST",
            success: function (data) {
                alert(data.status); 
            },
            error: function (a, b, c) { },
            data: { 'Name':'Glenn','Type':'4','Meals':["1","2"] }
        });
    </script>
    
    <h2>Index</h2>
    

    希望这会有所帮助...

    【讨论】:

    • 在 Web API,MVC 4 中,您可以简单地从动作中返回一个对象,它会根据请求返回 json 或 xml。例如IE 会得到 json,chrome 会得到 xml 结果
    • 是的 - 我知道 Web API。当我写我的例子时,我没有在原始问题中看到那个细节。
    • @Habib /GlennFerrieLive 谢谢你们的帮助。我能够把它修好。不过我有一个问题,你说如果你只是用 Web API 返回一个对象,它会返回 JSON 到 IE 和 XML 到 chrome?如果您编写的客户端 javascript 解析 json 怎么办?您是否必须编写 javascript/query 才能接受其中任何一个?
    • @user 接受标头将规定您收到的格式。这就是它的目的。您应该能够在两个浏览器中获得相同的响应。请参阅我的“$.ajaxsetup”声明中的“接受”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多