2012-12-28 10 views
11

Muszę przekazać dynamiczny obiekt JSON do mojego kontrolera Web API, aby móc go przetworzyć w zależności od jego typu. Próbowałem przy użyciu przykładu JSON.NET that can be seen here, ale kiedy używam Fiddler, widzę, że przekazane w JObect jest zawsze zerowe.Przekazywanie dynamicznego obiektu JSON do interfejsu API WWW - Newtonsoft Przykład

To wywierają na przykładzie wklejony Skrzypek:

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 Oto mój bardzo prosty sposób kontroler Web API:

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

Jestem nowy w tym i mam kilka pytań w tym obszarze:

Czy robię coś złego w tym konkretnym przykładzie?

Czy istnieje, co ważniejsze, lepszy sposób przekazywania dynamicznego obiektu JSON (z posta JavaScript AJAX)?

+2

Powinieneś uszeregować swój obiekt JavaScript przed umieszczeniem go na serwerze. Dane pokazane (obecnie) w twoim pytaniu nie reprezentują prawidłowego JSON. – Perception

+0

Nie mogłem zgłosić problemu w nowo utworzonym projekcie MVC4 Web.API. Wysyłam żądanie z skrzypkiem z dokładnie tymi samymi wartościami, a parametr 'jObject' jest poprawnie wypełniony danymi. Może coś jest nie tak z routingiem, czy masz jakieś niestandardowe trasy? – nemesv

+0

Dzięki nemesv. Próbowałem również nowego projektu i masz rację, jObject jest w porządku. Mam niestandardowe trasy, więc będę tam wyglądać. – davy

Odpowiedz

3

Dziękuję wszystkim, którzy pomogli tutaj. Niestety nigdy nie doszedłem do sedna tego, co było nie tak.

Przeportowałem projekt po kawałku do nowego projektu i działa dobrze.

Dla informacji, mam klasę RouteConfig, co jest dość prosty w tej chwili:

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 } 
     ); 
    } 
} 

Moje wezwanie do API używa teraz JSON.stringify:

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

Oryginalny działanie API Prace.

Zauważ, że gram teraz tylko w tym momencie, więc kod nie jest najlepszy, ale pomyślałem, że może być użyteczny w podstawowej formie, na wypadek gdyby ktoś inny miał podobny problem.

+0

jesteś pewien swojego kontrolera w pierwszej aplikacji? http: // localhost: 9185/api/Auto/PostSavePage/to musi być AutoController –

14

Zgodnie z komentarzem do Percepcji Twój JSON nie wygląda prawidłowo. Uruchom go poprzez JSONLint i masz:

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

Zmień go mieć "wokół nazwy pól:

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

Również próbowałeś wymieniając swoje JObject za albo JToken lub dynamicznego obiektu (np here)?

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

LUB

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

Dzięki, żadna z tych sugestii nie działa dla mnie. Zobacz powyższy komentarz nemesv. Myślę, że musi to mieć coś wspólnego z moimi niestandardowymi trasami. – davy

+0

@ davy przykro mi to słyszeć. Jeśli możesz zobaczyć, że testObject ma wartość null, twoje trasy powinny być w porządku ... czy możesz uzyskać punkt przerwania wewnątrz PostDavePage? Spróbuję jeszcze raz spróbować odpowiedzieć, jeśli masz konfigurację trasy do udostępnienia. –

+0

Wielkie dzięki. Dzieje się coś dziwnego. Zajmuję się kopiowaniem plików do mojego podstawowego rozwiązania roboczego. Mam nadzieję, że to zadziała, albo będę w stanie wskazać problem. Myślę, że projekt może być uszkodzony w jakiś sposób, ponieważ dostaję inne dziwne błędy, które nie będę jeszcze wprowadzać, ponieważ nie dostaję ich w nowej aplikacji. Będę aktualizował, gdy znajdę cokolwiek. Dzięki jeszcze raz. – davy

Powiązane problemy