序列化,反序列化C#/ JSON对象,没有套管问题

时间:2014-10-13 04:20:38

标签: javascript c# asp.net-mvc entity-framework

当我编写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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用ContractResolver类的JsonSerializerSettings属性:

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