我的 Web API C#.net 服务器无法反序列化 JSON 对象

my Web API C#.net server is not able to Deserialize JSON Object

这是我的客户代码

var sayeed = { firstname: "Sayeed", surname: "Alquiaty" };
alert(JSON.stringify({ person: sayeed }));
$.ajax({
    url: "api/parent",
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({ person: sayeed }),
    success: function(response) {
        response ? alert("It worked!") : alert("It didn't work.");
    }
});

在服务器端

public class Person {
    public string Firstname { get; set; }
    public string Surname { get; set; }
}

//Here I am able to receive object but is is not FirstName = null and Surname = null
// POST api/parent
public bool PostParent(Person person) {
    return person != null;
}

所以客户端得到一个成功的信息但是实际上JSON对象没有反序列化

我已经尝试过其他方法,例如使用 JObject,但这会破坏 Json 对象,我的意思是它将客户端对象转换为 Key,然后添加:“”。这不是我想要的。

感谢大家帮助我解决这个问题。 但是我可以在我的服务器端代码中发现这个错误

config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.XmlFormatter.UseXmlSerializer = false;

所以现在我评论了上面的配置设置,一切都开始完美运行。但这花了我 2 天时间才真正弄清楚真正的原因(据说)

抱歉,我忘了提及我对 PostParent(JObject 结果) 做了一些小改动,因此结果能够正确接收反序列化的 JSON 对象。然后我可以从中创建一个人对象。希望这对您有所帮助

你的代码有几个问题:

  1. 反序列化是区分大小写的,所以JS端的属性必须和服务端的属性大小写一致
  2. 你需要直接将人物对象作为参数传递,而不是作为对象的person 属性包含
  3. 虽然通常不会有什么坏处,但您不需要对对象进行字符串化。 jQuery ajax 会自动为您完成

关于 1,您可以设置 Web API 序列化程序将服务器端 PascalCase 转换为客户端驼峰式,反之亦然,但是在转换 属性 客户端和服务器端之间的名称:

var jsonformatter
  = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

jsonformatter.SerializerSettings.ContractResolver
  = new CamelCasePropertyNamesContractResolver();