2015-12-01 4 views
5

Ho un metodo API web che assomiglia a questo:WebAPI - Distacco al dizionario con JSON

[HttpPost] 
[Route("messages")] 
public IHttpActionResult Post(IEnumerable<Email> email) 
{ 
    AddToQueue(email); 
    return Ok("message added to queue"); 
} 

La mia classe email si presenta come questo momento:

public string Body { get; set; } 
public string From { get; set; } 
public string Template { get; set; } 
public string To { get; set; }   
public string Type { get; set; } 

E io sto postando al mio Metodo Post che utilizza il violinista, come questo:

User-Agent: Fiddler 
Host: localhost:3994 
Content-Length: 215 
Content-Type: application/json; charset=utf-8 
[ 
{"Body":"body","From":"from","To":"to","Template":"template"}, 
{"Body":"body1","From":"from1","To":"to1","Template":"template1"}, 
{"Body":"body2","From":"from2","To":"to2","Template":"template2"} 
] 

Questo funziona correttamente. Tuttavia, voglio essere in grado di aggiungere un dizionario per la mia classe e-mail, in modo che sarà simile a questa:

public string Body { get; set; } 
public string From { get; set; } 
public string Template { get; set; } 
public string To { get; set; }   
public string Type { get; set; } 
public Dictionary<string, string> HandleBars { get; set; } 

E ho cambiato la mia richiesta di simile a questa:

[{ 
    "Body": "body", 
    "From": "from", 
    "To": "to", 
    "Template": "template", 
    "HandleBars": [{ 
     "something": "value" 
    }] 
}, 
{ 
    "Body": "body1", 
    "From": "from1", 
    "To": "to1", 
    "Template": "template1" 
}, 
{ 
    "Body": "body2", 
    "From": "from2", 
    "To": "to2", 
    "Template": "template2" 
}] 

Tuttavia, quando il metodo Post riceve questo, tutti i campi Email vengono popolati, ad eccezione del dizionario HandleBars. Cosa devo fare per passarlo correttamente? Il mio json è strutturato in modo errato?

+1

Non sarebbe (all'interno della matrice JSON) '{ "valore": "qualcosa"," tasto ":" key1 "}'? (a seconda di come stai incastrando il tuo json potrebbe essere Value en Key) – Igor

+0

'HandleBars' è un' 'e stai passando solo una' stringa', così come dovresti dare il contenuto dentro 'HandleBars' nome' key' e 'value' – ragerory

+0

vedere, qui è già una risposta http://stackoverflow.com/questions/2494294/sending-a-json-array-to-be-received-as-a-dictionarystring -string – meorfi

risposta

6

Il valore predefinito JsonFormatter non è in grado di associare Dictionary da JavaScript Array perché non definisce una chiave per ciascun elemento.

È necessario utilizzare un Object invece:

"HandleBars": { 
    "something": "value" 
} 
+0

questo ha fatto. Grazie. – ygetarts

0

Si dovrebbe avere

{ 
    "Body": "body", 
    "From": "from", 
    "To": "to", 
    "Template": "template", 
    "HandleBars": [ 
     { key: 'key1', value: 'something'} 
    ] 
}