2014-10-13 54 views
0

当我编写Javascript函数时,我相信约定是使用pascalCase作为属性名称(第一个字的较低首字母),但创建C#属性时,它应该是CamelCase(大写的每个单词的第一个字母)。但是,这两种语言都区分大小写,并且在将JavaScript或C#对象序列化为JSON时由于大小写不匹配而导致出现问题。序列化,反序列化C#/ JSON对象并没有套管问题

我满足于在我的C#对象上添加属性以将C#CamelCase属性映射到Javascript pascalCase窗体的方法;它看起来很干净,明确,并允许我在每种语言中编写“始终用这种方式”的方法,这让我减少了错误,并且我喜欢一致性。但是,对于生成的对象(例如实体框架对象),这些对象是在没有这些属性的情况下生成的,如果我要添加它们,然后决定重新生成以拾取数据库更改,则会丢失属性。 (我正在使用Visual Studioo,ASP.NET MVC和反向工程代码“First”from a database。)

我是所有这些技术的新手。我想建议您如何轻松地序列化这些对象,以便即使对于生成的对象也能够一致地使用所需的外壳。在这种情况下是否有办法让所有这些都成为现实?

在这个问题上有很多问题,但我不确定这个特定的角度已经解决。

这里是一个人为的例子,我打,试图了解这些主题:

function Person(name, age) 
{ 
    this.name = name; 
    this.age = age; 
    return this; 
} 


$(document).ready(function() { 

    /* Finds all of the controls whose IDs begin with PushMeButton */ 
    $("[id^=PushMeButton]").click(function() { 

     //var id = $(this).attr('id'); 

     var url = '/Home/Ajax/'; 
     var joe = new Person("Joe", 98); 

     $.ajax({ 
      type: 'POST', 
      url: url, 
      dataType: 'json', 
      data: joe, 
      success: function (person) { 
       alert('im back'); 
       alert(person.age); 
      }, 
      error: function (xhr, ajaxOptions, error) { 
       alert(xhr.status); 
       alert('Error: ' + xhr.responseText); 
      } 
     }); 
    }); 
}); 

//Server: 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Newtonsoft.Json; 
using Restaurant.Data; 

namespace MyApp.Controllers 
{ 
    public class Person 
    { 
     [JsonProperty(PropertyName = "name")] 
     public string Name 
     { 
      get; 
      set; 
     } 

     [JsonProperty(PropertyName = "age")] 
     public int Age 
     { 
      get; 
      set; 
     } 
    } 

    public class HomeController : Controller 
    { 
     [HttpPost] 
     public string Ajax(Person person) 
     { 
      person.Name = "Mr. " + person.Name; 
      person.Age += 10; 
      string personJson = JsonConvert.SerializeObject(person); 

      return personJson; 
     } 
    } 
} 

回答

1

可以使用JsonSerializerSettings类的ContractResolver属性:

var settings = new JsonSerializerSettings{ ContractResolver = new CamelCasePropertyNamesContractResolver() }; 
var s = JsonConvert.SerializeObject(object, settings); 
var newObject = JsonConvert.DeserializeObject<type>(s, settings); 
+0

上面的代码会变成一个类像'class Test {public string MyProp {get; set;}}'到json'{myProp:...}',并且将其反序列化为'MyProp' c#属性。在这个例子中,我将serailization和deserialization线放在一起,仅仅向你展示如何执行两个操作。 – Luizgrs

+0

看起来MVC(?)负责将服务器端的自动反序列化从JSON转换为C#对象,I只需要处理发送它在pascalCase,这似乎这样做。美丽。谢谢。 – ChadD