WebAPIからのjson出力を変更しようとしています。Peopleのようなオブジェクトがあるとすると、現在の出力は次のようになります。
[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]
ただし、出力は次のようになります。
{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}
これをどのように行うことができるかについてのアイデアはありますか?
WebAPIからのjson出力を変更しようとしています。Peopleのようなオブジェクトがあるとすると、現在の出力は次のようになります。
[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]
ただし、出力は次のようになります。
{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}
これをどのように行うことができるかについてのアイデアはありますか?
オプション1-新しいモデルを作成する
戻る代わりに
public IEnumerable<Person> Get()
戻る
public People Get()
どこ
public class People {
public IEnumerable<Person> People {get; set;}
}
オプション2-ダイナミックを返す
戻る代わりに
public IEnumerable<Person> Get()
戻る
public dynamic Get() {
IEnumerable<Person> p = //initialize to something;
return new {people = p};
}
オプション3-JsonMediaTypeFormatterを変更します
あなたはまだ戻ることができます
public IEnumerable<Person> Get()
ただし、次のクラスを追加します。
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);
}
}
WebApiConfigで、古いJSONではなく新しいフォーマッターを登録するだけです。
config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new PeopleAwareMediaTypeFormatter());
リストオブジェクトの変数名がPersonList
返されると仮定しましょう
[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]
痛みを伴わずに次のように簡単に戻ることができます
return new
{
people = PersonList
};
その後、あなたは持っているでしょう
{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}
DTO
あなたはこれのために持っている必要がありますJSON
。つまり、あなたがしなければならないのは、配列用のコンテナを用意することだけです。
public class ReturnedJson
{
public IList<People> People {get;set;}
}
public class People
{
public string name {get;set;}
public string sex{get;set;}
}
これは、コードを表示していないため、このjsonのDTOがあるという私の仮定です。
ListはIEnumerableを実装しているため、Filip Wの2番目のオプションに基づいて、これはデータベースから適切に取得されます。
public dynamic 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 };
}