2012-02-14 7 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'在庫ではありません。そうですか? –

+0

はい。 JSON.NETへの参照は既にプロジェクトに含まれています。このシナリオではまだ(まだ)それを利用していません。 –

+0

これは2,3日前のこの質問に似ています:http://stackoverflow.com/questions/9247478/pascal-case-dynamic-properties-with-json-net/9247705#9247705 –

答えて

2

新しい匿名型に投影することにより、カンニングすることができます:あなた自身のJson.NETベースコンバータ書くことについてどのように

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

return Json(projected, JsonRequestBehavior.AllowGet); 
0

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

をこれはちょうどあなたのアプリケーション全体のために働くだろう、あなたのクラスの必要性を小文字に変更する必要はありません。

以下はコントローラアクションの使用例です:

[AcceptVerbs(HttpVerbs.Get)] 
public virtual NJsonResult GetData() 
{ 
    var data = ... 
    return new NJsonResult(data); 
}