Перво-наперво:
[{000:"Milan"},{001:"Istanbul"},{002:"Baku"}]
является недействительным JSON. Свойства должны быть указаны так:
[{"000":"Milan"},{"001":"Istanbul"},{"002":"Baku"}]
Чтобы добиться этого выхода, вы можете использовать Dictionary<string, string>
, который JavaScriptSerializer
будет сериализован в желаемый выход. Поэтому просто вызовите метод расширения ToDictionary
для вашей модели, чтобы преобразовать его в словарь:
Вот так:
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult getBranchViaJson()
{
var branches =
from p in getBranchs(AppSession.BranchID.Value)
select new { p.Code, p.Name };
var model = branches.ToDictionary(x => x.Code, x => x.Name);
return Json(new[] { model }, JsonRequestBehavior.AllowGet);
}
или если вы хотите сохранить свой приватный метод, который возвращает объект, вы можете сделать так, чтобы он возвращал словарь:
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult getBranchViaJson()
{
return Json(getBranchList(AppSession.BranchID.Value), JsonRequestBehavior.AllowGet);
}
private object getBranchList(int n)
{
var mybranchList = from p in getBranchs(n)
select new { p.Code, p.Name };
return new[] { mybranchList.ToDictionary(x => x.Code, x => x.Name) };
}
Обратите внимание, что я использовал new[] { model }
. Это связано с тем, что в противном случае JavaScriptSerializer не будет создавать массив javascript, как требуется, а будет простым объектом javascript.
Примечание: обратите внимание, что я добавил JsonRequestBehavior.AllowGet
, чтобы это действие контроллера можно было использовать с запросом GET, который по умолчанию отключен для действий, возвращающих ответы JSON.