2012-02-14 7 views
4

Я стараюсь придерживаться соглашений об именах как в JavaScript, так и в C#. Это приводит к интересным вопросам при передаче JSONized данных взад и вперед. Когда я обращаюсь к клиентской стороне координаты x/y, я ожидаю, что свойство будет строчным, а на стороне сервера - в верхнем регистре.Преобразование System.Drawing.Point в JSON. Как преобразовать «X» и «Y» в «x» и «y»?

Наблюдайте:

public class ComponentDiagramPolygon 
{ 
    public List<System.Drawing.Point> Vertices { get; set; } 

    public ComponentDiagramPolygon() 
    { 
     Vertices = new List<System.Drawing.Point>(); 
    } 
} 

public JsonResult VerticesToJsonPolygon(int componentID) 
{ 
    PlanViewComponent planViewComponent = PlanViewServices.GetComponentsForPlanView(componentID, SessionManager.Default.User.UserName, "image/png"); 
    ComponentDiagram componentDiagram = new ComponentDiagram(); 

    componentDiagram.LoadComponent(planViewComponent, Guid.NewGuid()); 

    List<ComponentDiagramPolygon> polygons = new List<ComponentDiagramPolygon>(); 

    if (componentDiagram.ComponentVertices.Any()) 
    { 
     ComponentDiagramPolygon polygon = new ComponentDiagramPolygon(); 
     componentDiagram.ComponentVertices.ForEach(vertice => polygon.Vertices.Add(vertice)); 
     polygons.Add(polygon); 
    } 

    return Json(polygons, JsonRequestBehavior.AllowGet); 
} 

Я понимаю, что если я могу использовать C# атрибут «JsonProperty» для настройки именования. Тем не менее, насколько я могу судить, это применимо только к классам, которыми я являюсь.

Как изменить свойства System.Drawing.Point при передаче обратно клиенту?

+0

Если вы используете 'JsonProperty', то вы используете JSON.NET, а не« JavaScriptSerializer »; это так? –

+0

Да. Ссылка на JSON.NET уже включена в проект - я просто не использовал его (пока) в этом сценарии. –

+0

Это похоже на этот вопрос пару дней назад: http://stackoverflow.com/questions/9247478/pascal-case-dynamic-properties-with-json-net/9247705#9247705. –

ответ

2

Вы можете обмануть, проецируя в новый анонимный тип:

var projected = polygons.Select(p => new { Vertices = p.Vertices.Select(v => new { x = v.X, y = v.Y }) }); 

return Json(projected, JsonRequestBehavior.AllowGet); 
0

Как насчет написания собственных на основе Json.NET нейтрализатор:

public class NJsonResult : ActionResult 
{ 
    private object _obj { get; set; } 

    public NJsonResult(object obj) 
    { 
     _obj = obj; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.AddHeader("content-type", "application/json"); 
     context.HttpContext.Response.Write(
       JsonConvert.SerializeObject(_obj, 
              Formatting.Indented, 
              new JsonSerializerSettings 
               { 
                ContractResolver = new CamelCasePropertyNamesContractResolver() 
               })); 
    } 
} 

Это будет просто работать для всего приложения, без необходимости переименования свойств (в нижнем регистре) в ваших классах следующим образом: return Json(new { x = ..., y = ...});

И ниже приведен пример использования в действии контроллера:

[AcceptVerbs(HttpVerbs.Get)] 
public virtual NJsonResult GetData() 
{ 
    var data = ... 
    return new NJsonResult(data); 
} 
Смежные вопросы