2012-12-28 12 views
11

Devo passare un oggetto JSON dinamico al mio controller API Web in modo che possa elaborarlo a seconda del tipo. Ho provato a utilizzare l'esempio JSON.NET that can be seen here ma quando uso Fiddler, posso vedere che il passato in JObect è sempre nullo.Passare l'oggetto Dynamic JSON all'API Web - Newtonsoft Esempio

Questo è un esercitano dall'esempio incollato in 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 Ecco il mio metodo molto semplice controller Web API:

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

io sono nuovo a questo e ho un paio di domande intorno a quest'area:

Sto facendo qualcosa di sbagliato in questo particolare esempio?

Probabilmente, ancora più importante, c'è un modo migliore per passare in un oggetto JSON dinamico (da un post AJAX JavaScript)?

+2

È necessario stringificare l'oggetto JavaScript prima di pubblicarlo sul server. I dati mostrati (attualmente) nella tua domanda non rappresentano JSON validi. – Perception

+0

Non ero in grado di riproire il problema in un progetto WebCAP4 MVC4 appena creato. Invio una richiesta con il violinista con gli stessi identici valori e il parametro 'jObject' è riempito correttamente con i dati. Forse qualcosa non va nel tuo percorso, hai percorsi personalizzati? – nemesv

+0

Grazie nemesv. Ho anche provato un nuovo progetto e hai ragione, il jObject va bene. Ho percorsi personalizzati, quindi dare un'occhiata lì. – davy

risposta

3

Grazie a tutti coloro che hanno aiutato qui. Sfortunatamente, non sono mai arrivato al fondo di ciò che era sbagliato.

Ho portato il progetto su un nuovo progetto e funziona perfettamente.

Per info, ho una classe RouteConfig, che è abbastanza semplice in questo momento:

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

Il mio invito in API ora utilizza JSON.stringify:

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

L'azione API originale lavori.

Nota che al momento sto giocando solo con questo, quindi il codice non è il migliore, ma ho pensato che potrebbe essere utile in forma base nel caso in cui qualcun altro abbia un problema simile.

+0

sei sicuro del tuo controller nella prima app? http: // localhost: 9185/api/Auto/PostSavePage/deve essere AutoController –

14

Come da commento di Perception, il tuo JSON non sembra valido. Eseguirlo tramite JSONLint e si ottiene:

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

Cambio di avere "in giro per i nomi dei campi:

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

ho anche provato scambiando la vostra jobject sia per un JToken o un oggetto dinamico (ad esempio, here)?

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

O

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

Grazie, nessuno di questi suggerimenti funziona per me. Vedi il commento di nemesv sopra. Penso che debba essere qualcosa a che fare con i miei percorsi personalizzati. – davy

+0

@davy scusa per sentirlo. Se sei in grado di vedere che testObject è nullo, i percorsi dovrebbero essere OK ... puoi ottenere un punto di interruzione all'interno di PostDavePage? Proverò a prendere un'altra pugnalata a rispondere se hai la tua route config da condividere. –

+0

Grazie mille. Sta succedendo qualcosa di strano Sono in procinto di copiare i file nella mia soluzione di lavoro di base. Spero quindi che funzionerà o sarò in grado di individuare il problema. Penso che il progetto potrebbe essere corrotto in qualche modo poiché sto ottenendo alcuni altri strani errori che non entrerò ancora visto che non li prendo nella nuova app. Aggiornerò quando trovo qualcosa. Grazie ancora. – davy

Problemi correlati