2012-11-26 15 views
28

Come posso/è possibile passare in un oggetto json a un controller webapi (POST) e non avere una classe per mapparlo, ma piuttosto gestirlo come contenuto arbitrario ?come inviare un oggetto json arbitrario a webapi

Quindi, se mi passa dal mio cliente in questo modo:

 createRecord: function (model, data, callback, callbackParams) { 
     var request = jQuery.ajax({ 
      type: "POST", // default = GET, 
      url: '/api/' + model + '/', 
      data: data, 
      contentType: 'application/json', 
      success: function (msg) { 
       $('#results').text(msg); 
       if (callback) // only fire a callback if it has been specified 
        callback(msg, callbackParams); 
      }, 
      error: function (jqXHR, textStatus) { 
       alert('Request failed: ' + textStatus); 
      } 
     }); 
    } 

e dei dati è qualcosa di simile:

{ "_id" : ObjectId("5069f825cd4c1d590cddf206"), "firstName" : "John", "lastName" : "Smith", "city" : "Vancouver", "country" : "Canada" } 

mio regolatore sarà in grado di analizzarlo? E la prossima volta i dati potrebbero non corrispondere a quello della firma (per esempio:

{ "_id" : ObjectId("5069f825cd4c1d56677xz6"), "company" : "Acme" } 

Nel mio controller, ho provato:

public HttpResponseMessage Post([FromBody]JObject value) 

e:

public HttpResponseMessage Post([FromBody]string value) 

e (perché questo è in realtà per lavorare con un mongo db):

public HttpResponseMessage Post([FromBody]BsonDocument value) 

ma sembra che l'object mapper voglia mappare qualcosa di diverso dalla stringa ...

risposta

21

Puoi avere il tuo metodo post che accetta un HttpRequestMessage per passare la logica di associazione del modello e puoi leggere il contenuto della richiesta direttamente:

public HttpResponseMessage Post(HttpRequestMessage req) 
    { 
     var data = req.Content.ReadAsStringAsync().Result; // using .Result here for simplicity... 
     ... 

    } 

Tra l'altro, il motivo per cui l'azione che porta in jobject non funziona a causa di 'ObjectId ('...')' che viene utilizzato come il valore di '_id' in i tuoi dati ...

+0

grazie per questo - sia questa sia la risposta di kxb sono utili - risposta premiata al primo risponditore – Jonathan

2

Nel tuo input, "_id": ObjectId("5069f825cd4c1d590cddf206") è ciò che sta rompendo la materializzazione JSON sul server. Rimozione ObjectId e utilizzando "_id" : "5069f825cd4c1d590cddf206" lavori con JObject così come Dictionary<string, object>

17

Siamo passati oggetto JSON con jQuery, e analizzarlo in oggetto dinamico. funziona bene questo è il codice di esempio:

ajaxPost: 

... 
Content-Type: application/json, 
data: { 
      "name": "Jack", 
      "age": "12" 
     } 
... 

WebAPI:

[HttpPost] 
public string DoJson2(dynamic data) 
{ 
    string name = data.name; 
    int age = data.age; 

    return name; 
} 

domanda similmente su StackOverflow: WebAPI Multiple Put/Post parameters

-5

E 'molto semplice, basta mettere il Accetta intestazione a "application/json ".

Problemi correlati