2012-02-14 212 views
4

我想遵守JavaScript以及C#中的命名約定。當來回傳遞JSON化數據時,這會引發一些有趣的問題。當我訪問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';是這樣嗎? – 2012-02-14 22:35:50

+0

是的。對JSON.NET的引用已經包含在項目中 - 在這種情況下,我還沒有使用它(還)。 – 2012-02-14 22:38:13

+0

這幾天前似乎類似於這個問題:http://stackoverflow.com/questions/9247478/pascal-case-dynamic-properties-with-json-net/9247705#9247705。 – 2012-02-14 22:48:36

回答

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