【问题标题】:Passing Dynamic JSON Object to Web API - Newtonsoft Example将动态 JSON 对象传递给 Web API - Newtonsoft 示例
【发布时间】:2012-12-13 20:22:34
【问题描述】:

我需要将动态 JSON 对象传递给我的 Web API 控制器,以便我可以根据它的类型对其进行处理。我曾尝试使用 JSON.NET 示例 that can be seen here,但是当我使用 Fiddler 时,我可以看到传入的 JObect 始终为空。

这是粘贴到 Fiddler 中的示例:

POST http://localhost:9185/api/Auto/PostSavePage/  HTTP/1.1
User-Agent: Fiddler
Content-type: application/json
Host: localhost
Content-Length: 88

{AlbumName: "Dirty Deeds",Songs:[ { SongName: "Problem Child"},{ SongName:  
"Squealer"}]}

这里是我非常简单的 Web API 控制器方法:

 [HttpPost]
 public JObject PostSavePage(JObject jObject)
 {        
     dynamic testObject = jObject;         
     // other stuff here
 }

我是新手,我有几个关于这个领域的问题:

在这个特定的例子中我做错了吗?

可以说,更重要的是,是否有更好的方法来传递动态 JSON 对象(来自 JavaScript AJAX 帖子)?

【问题讨论】:

  • 您应该在将 JavaScript 对象发布到服务器之前对其进行字符串化。您问题中显示的(当前)数据不代表有效的 JSON。
  • 我无法在新创建的 MVC4 Web.API 项目中重现您的问题。我使用 fiddler 发送一个具有完全相同值的请求,并且 jObject 参数正确填充了数据。可能您的路由有问题,您有自定义路由吗?
  • 感谢 nemesv。我也尝试了一个新项目,你是对的,jObject 很好。我确实有自定义路线,所以会在那里看看。

标签: asp.net-mvc json asp.net-mvc-4 asp.net-web-api


【解决方案1】:

感谢所有在这里提供帮助的人。不幸的是,我从来没有弄清楚到底是哪里出了问题。

我将项目一块一块地移植到一个新项目中,它工作正常。

关于信息,我有一个 RouteConfig 类,目前非常简单:

public class RouteConfig
{       
    private static string ControllerAction = "ApiControllerAction";

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: ControllerAction,
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

我对 API 的调用现在使用 JSON.Stringify:

$.ajax("http://localhost:54997/api/values/PostSavePage/", {
    data:  JSON.stringify(jObject),                               
    contentType: 'application/json',
    type: 'POST'
});

原始 API 操作有效。

请注意,我目前只是在玩这个,所以代码不是最好的,但我认为它在基本形式中可能很有用,以防其他人遇到类似问题。

【讨论】:

【解决方案2】:

根据 Perception 的评论,您的 JSON 看起来无效。通过JSONLint 运行它,你会得到:

Parse error on line 1:
{    AlbumName: "Dirty De
-----^
Expecting 'STRING', '}'

将其更改为在字段名称周围有 ":

{
    "AlbumName": "Dirty Deeds",
    "Songs": [
        {
            "SongName": "Problem Child"
        },
        {
            "SongName": "Squealer"
        }
    ]
}

您是否尝试过将 JObject 换成 JToken 或动态对象(例如 here)?

[HttpPost]
 public JObject PostSavePage(JToken testObject)
 {                
     // other stuff here
 }

 [HttpPost]
 public JObject PostSavePage(dynamic testObject)
 {                
     // other stuff here
 }

【讨论】:

  • 谢谢,这些建议都不适合我。请参阅上面的 nemesv 评论。我认为这一定与我的自定义路线有关。
  • @davy 很遗憾听到这个消息。如果您能够看到 testObject 为空,那么您的路线应该没问题...您可以在 PostDavePage 中获得断点吗?如果您有要分享的路线配置,我会尝试再次尝试回答。
  • 非常感谢。一些奇怪的事情正在发生。我正在将文件复制到我的基本工作解决方案中。希望到那时,它会起作用,否则我将能够查明问题。我认为该项目可能会以某种方式损坏,因为我遇到了一些其他奇怪的错误,因为我没有在新应用程序中得到它们,所以我不会进入这些错误。当我发现任何东西时,我会更新。再次感谢。
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多