5

WebAPIからのjson出力を変更しようとしています。Peopleのようなオブジェクトがあるとすると、現在の出力は次のようになります。

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

ただし、出力は次のようになります。

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

これをどのように行うことができるかについてのアイデアはありますか?

4

4 に答える 4

14

オプション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());
于 2013-01-22T04:40:01.143 に答える
2

リストオブジェクトの変数名がPersonList返されると仮定しましょう

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

痛みを伴わずに次のように簡単に戻ることができます

       return new
        {
            people = PersonList
        };

その後、あなたは持っているでしょう

{"people":[{name:"John", sex:"M"},{name:"Simon", sex:"M"}]}
于 2014-10-05T01:13:24.323 に答える
0

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があるという私の仮定です。

于 2013-01-22T04:41:04.697 に答える
0

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

}

于 2014-01-26T22:45:53.643 に答える