当我编写Javascript函数时,我认为惯例是使用pascalCase作为属性名称(第一个单词的第一个字母的下半部分),但是在创建C#属性时,它应该是CamelCase(每个单词的首字母大写。 )但是,这两种语言都区分大小写,这会导致将Javascript或C#对象序列化为JSON并因为大小写不匹配而导致问题。
我满足于在C#对象上添加Attributes以将C#CamelCase属性映射到Javascript pascalCase表单的方法;它似乎干净,明确,并允许我在每种语言中写作时保持“总是这种方式”的方法,我觉得这有助于我减少错误,我喜欢一致性。但是,对于生成的对象(例如,实体框架对象),生成这些对象时没有这些属性,如果我要添加它们然后决定重新生成以获取数据库更改,我将丢失属性。 (我使用的是Visual Studioo,ASP.NET MVC和反向工程代码“First”来自数据库。)
我是所有这些技术的新手。我想建议您如何轻松地序列化这些对象,以便即使生成的对象也可以使用所需的外壳。有没有办法在这种情况下拥有一切?
关于这个问题有很多问题,但我不确定这个角度是否得到解决。
这是一个人为的例子,我试着去学习这些主题:
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;
}
}
}
答案 0 :(得分:1)
您可以使用ContractResolver
类的JsonSerializerSettings
属性:
var settings = new JsonSerializerSettings{ ContractResolver = new CamelCasePropertyNamesContractResolver() };
var s = JsonConvert.SerializeObject(object, settings);
var newObject = JsonConvert.DeserializeObject<type>(s, settings);