Json, как правильно сделать

mnde

делаю страницу на asp.net mvc3есть метод, который возращает Json
[AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Roll(int roll)
 {
 // to do something

 var jsonData = new
 {
 MapInfo = RenderGame(g),
 GameLog = string.Join("
", g.LogInfo),

 };

 return Json(jsonData);

 }
 public JsonResult RenderGame(Game g)
 {
 
 var jsonData = new
 {
 Map = g.Cells.Select(x => new
 {
 id = x.Value.Id,
 text = x.Value.PrintTextOnCell,
 color = MapHelper.GetPlayerColorRGB(x.Value.Owner),
 }),
 Players = MapHelper.GetPlayerState(g).Select(x => new
 {
 id = x.Key,
 images = x.Value,
 }),
 PlayersState = Template.RenderPartialToString("~/Partials/PlayersState.ascx", g),
 GameLog = string.Join("
", g.LogInfo),
 };
 return Json(jsonData);
 }
как сделать, чтобы можно было вложить один объект(который передаются из функции RenderGame ) в другой(который в Roll) и чтобы можно было на клиенте достучаться например по data.MapInfo.Mapв Json не сильно шарю, так что можете попинать
function roll(n) {
 $.post("/Game/Roll",
 { roll: n },
 function (data) {
 //UpdateMap(data);
 data.MapInfo.Map
 });
}
14 ответов

mnde

возвращать объект видаclass My{public MapInfo;public ...}серилизовать в джейсон и вуаля, очевидно вродеп.с. не люблю анонимные объекты (var jsonData = new {};


mnde

возвращать объект видаclass My{public MapInfo;public ...}серилизовать в джейсон и вуаля, очевидно вродеп.с. не люблю анонимные объекты (var jsonData = new {};
хотелось бы без создания новых объектов-заглушексоздаем анонимный объект, в качестве поля - возращаемая строка в Json формате из другого метода


mnde

mnde,
хотелось бы без создания новых классов-заглушек


mnde

var jsonData = new
 {
 MapInfo = RenderGame(g),
 GameLog = string.Join("", g.LogInfo),

 };
Вынеси в отдельный метод и используйИ, кстати, вместо [AcceptVerbs(HttpVerbs.Post)] в MVC3 можно использовать HttpPostИ наверн не помешает доп. проверка Request.IsAjaxRequest(), раз все равно скриптами обращаешься


mnde

var jsonData = new
 {
 MapInfo = RenderGame(g),
 GameLog = string.Join("", g.LogInfo),

 };
Вынеси в отдельный метод и используйИ, кстати, вместо [AcceptVerbs(HttpVerbs.Post)] в MVC3 можно использовать HttpPostИ наверн не помешает доп. проверка Request.IsAjaxRequest(), раз все равно скриптами обращаешься
как в отдельный?мне надо использовать только анонимные объектыкак выше уже писал, есть dataJson = new {fild1 = здесь обязательно данные из другого метода, но желательно вернуть строкой в жсон формате, так как неохота(будет потом проблематично) создавать новый класс, чтобы явно задекларировать, что хочу вернуть}


mnde

ну и на будущее, кто аматар и не знает как сделать, желательно промолчать, мне именно нужно узнать как работать с жсоном на сервере, то есть сериализовать объект в строку и корректно передать на клиента


mnde

RenderGame должен принципиально возвращаться строку? Делайте также анонимный объект встраивайте его в выше стоящий и серилизуйте.


mnde

RenderGame должен принципиально возвращаться строку? Делайте также анонимный объект встраивайте его в выше стоящий и серилизуйте.
хотелось бы вернуть из другого метода(но анонимные видны только в текущем методе)как понимаю вариант один, вернуть как строку в жсон формате и присвоить полю корневого объекта, потом этот корневой сериализовать и послать клиенту(!!! интересует именно этот случай)


mnde

хотелось бы вернуть из другого метода(но анонимные видны только в текущем методе)как понимаю вариант один, вернуть как строку в жсон формате и присвоить полю корневого объекта, потом этот корневой сериализовать и послать клиенту(!!! интересует именно этот случай)
ваш способ обречен так как вдумайтесь что пишите, вы вернете строку и присвоете её полю - это будет уже строка для дальнешего ипользования, так как эту строку дженсон заэкранирует при возврате поля MapInfo из Roll. На клиенте MapInfo будет в виде строки.


mnde

ваш способ обречен так как вдумайтесь что пишите, вы вернете строку и присвоете её полю - это будет уже строка для дальнешего ипользования, так как эту строку дженсон заэкранирует при возврате поля MapInfo из Roll. На клиенте MapInfo будет в виде строки.
може есть опция , типа указываешь что сериализованный объект и жсон сам корректно все делаетпроблема то в чем, у меня в нескольких местах такой код и в каждом место вставлять код из RenderGame оч плохо, так как все раздуется, новый класс заводить тоже не охота, так как есть обходное решениеделать один анонимный корневой объект и возращать его, без присваиваний полям другого аноноимного объекта


mnde

mnde, спокойно выносишь в отдельный метод возвращающий результат в виде Object или dynamic и не паришься


mnde

mnde, спокойно выносишь в отдельный метод возвращающий результат в виде Object или dynamic и не паришься
чтобы вернуть обжект, надо все равно делкрировать классвроде так нельзя
object getChildData()
{
//............
return new {field1=blabla, field2=blabla}
}


 public ActionResult Roll(int roll)
 {
 // to do something

 var jsonData = new
 {
 MapInfo = getChildData(),
 
 };

 return Json(jsonData);

 }


mnde

mnde, да объяви ты класс, я ровным счетом не вижу в этом ничего плохогокогда юзаешь var для анонимных типов - ты все равно объявляешь класс, только в CLRТы вообще смотрел в дизасемблере как в результате выглядят твои методы?


mnde

чтобы вернуть обжект, надо все равно делкрировать классвроде так нельзя
object getChildData()
{
//............
return new {field1=blabla, field2=blabla}
}


 public ActionResult Roll(int roll)
 {
 // to do something

 var jsonData = new
 {
 MapInfo = getChildData(),
 
 };

 return Json(jsonData);

 }
Ах тыж салабон, я аж усомнился, мало ли как обновился сишарп, можно
internal class Program
 {
 private static void Main(string[] args)
 {
 Console.WriteLine(Test1());
 Console.WriteLine(Test2());
 }

 private static object Test1()
 {
 return new { TestName = "Test1", SomeField = 1 };
 }

 private static object Test2()
 {
 return new { TestName = "Test2", SomeOtherField = 1 };
 }
 }
выводит:{ TestName = Test1, SomeField = 1 }{ TestName = Test2, SomeOtherField = 1 }Press any key to continue . . .