Передача динамического объекта JSON для веб-API - пример Newtonsoft

Мне нужно передать динамический объект JSON на мой контроллер веб-API, чтобы я мог обрабатывать его в зависимости от того, какой тип он есть. Я попытался использовать пример JSON.NET , который можно увидеть здесь, но когда я использую Fiddler, я вижу, что переданный в JObect всегда null.

Это приложение из примера, вставленного в 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"}]}

Ans вот мой очень простой метод API API:

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

Я новичок в этом, и у меня есть несколько вопросов по этой области:

Я делаю что-то не так в этом конкретном примере?

Возможно, что более важно, есть ли лучший способ передать динамический объект JSON (из сообщения JavaScript AJAX)?

Ответ 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

В соответствии с комментарием о восприятии ваш JSON не выглядит действительным. Запустите его через JSONLint, и вы получите:

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

Измените его, чтобы иметь "вокруг имен полей:

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

Также вы попытались заменить свой JObject для объекта JToken или Dynamic (например, здесь)?

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

ИЛИ

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