2013-01-22 14 views
5

Sto tentando di modificare l'output JSON dall'API Web. Dire che ho un oggetti come persone, l'uscita di corrente sarebbe come:API Web ASP.net - Aggiungi nome array all'output

[{name:"John", sex:"M"},{name:"Simon", sex:"M"}] 

Tuttavia vorrei l'output di essere come:

{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]} 

qualche idea su come questo potrebbe essere fatto?

risposta

14

Opzione 1 - Creare un nuovo modello di

Invece di tornare

public IEnumerable<Person> Get() 

ritorno

public People Get() 

dove

public class People { 
    public IEnumerable<Person> People {get; set;} 
} 

Opzione 2 - tornare dinamica

Invece di tornare

public IEnumerable<Person> Get() 

ritorno

public dynamic Get() { 
    IEnumerable<Person> p = //initialize to something; 
    return new {people = p}; 
} 

Opzione 3 - modificare JsonMediaTypeFormatter

È ancora possibile tornare

public IEnumerable<Person> Get() 

ma aggiungere la seguente classe:

public class PeopleAwareJsonMediaTypeFormatter : JsonMediaTypeFormatter 
{ 
    public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, HttpContent content, TransportContext transportContext) 
    { 
     if ((typeof (IEnumerable<People>).IsAssignableFrom(type))) 
     { 
      value = new {people = value}; 
     } 
     return base.WriteToStreamAsync(type, value, writeStream, content, transportContext); 
    } 
} 

ora in WebApiConfig basta registrare il nuovo formattatore al posto della vecchia JSON uno:

config.Formatters.RemoveAt(0); 
config.Formatters.Insert(0, new PeopleAwareMediaTypeFormatter()); 
0

Che deve avere un DTO per questo JSON. Quindi, quello che devi fare è semplicemente avere un contenitore per il tuo array.

public class ReturnedJson 
{ 
    public IList<People> People {get;set;} 
} 

public class People 
{ 
    public string name {get;set;} 
    public string sex{get;set;} 
} 

Questo è il mio presupposto che tu abbia un DTO per questo json, perché non hai mostrato alcun codice.

0

Sulla seconda opzione di Filip W, questo ben tira dal database dal Lista implementa IEnumerable:

Get pubblico dinamico() {

List<Person> personList = new List<Person>(); 

using (DataTable dt = db.ExecuteDataTable("PeopleSelect")) { 
    foreach (DataRow dr in dt.Rows) { 
     personList.Add(new Person { name = (string)dr["name"], ...}); 
    } 
} 

return new { people = personList }; 

}

2

lascia supporre variabile il nome dell'oggetto elenco è PersonList che restituisce

[{name:"John", sex:"M"},{name:"Simon", sex:"M"}] 

Si può semplicemente fare ritorno come segue senza dolore

 return new 
     { 
      people = PersonList 
     }; 

allora dovrete

{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}