2013-01-22 7 views
5

Próbuję zmienić wyjście json z Web API. Że mam obiekty jak ludzie, prąd wyjściowy będzie jak:ASP.net Web API - Dodaj nazwę macierzy do wyjścia

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

Jednak chciałbym wyjście być jak:

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

Wszelkie pomysły jak można to zrobić?

Odpowiedz

14

Wariant 1 - Tworzenie nowego modelu

Zamiast powrocie

public IEnumerable<Person> Get() 

powrót

public People Get() 

gdzie

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

Wariant 2 - powrót dynamiczny

Zamiast powrocie

public IEnumerable<Person> Get() 

powrót

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

Opcja 3 - modyfikować JsonMediaTypeFormatter

Nadal można powrócić

public IEnumerable<Person> Get() 

jednak dodać następujące klasy:

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

teraz w WebApiConfig tylko zarejestrować nowego formatowania zamiast starego JSON jednym:

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

Musisz być o DTO tego JSON. Musisz więc mieć pojemnik na swoją tablicę.

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

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

To jest moje założenie, że masz DTO dla tego json, ponieważ nie pokazałeś żadnego kodu.

0

Opierając się na drugą opcję Filip W, ten ładnie ściąga z bazy danych, ponieważ Lista implementuje IEnumerable:

publiczny dynamiczny Get() {

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

Załóżmy zmiennej nazwa obiektu listy to PersonList, która zwraca

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

Można po prostu nie wraca jak następuje bez bólu

 return new 
     { 
      people = PersonList 
     }; 

będziesz musiał

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