【问题标题】:my Web API C#.net server is not able to Deserialize JSON Object我的 Web API C#.net 服务器无法反序列化 JSON 对象
【发布时间】:2015-05-03 15:23:58
【问题描述】:

这是我的客户代码

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,然后添加:“”。这不是我想要的。

【问题讨论】:

  • 如果您只发布“{'firstname':'Sayeed','surname':'Alquiaty'}”会发生什么
  • 嗨尼克,我试过了,所以我的人对象为空。
  • 如果你在第一行大写你的参数名称会怎样: var sayeed = { Firstname: "Sayeed", Surname: "Alquiaty" };

标签: c# json asp.net-web-api2


【解决方案1】:

你的代码有几个问题:

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

关于 1,您可以设置 Web API 序列化程序以将服务器端 PascalCase 转换为客户端 CamelCase,反之亦然,但在客户端和服务器端之间转换属性名称时仍然需要考虑这一点:

var jsonformatter
  = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

jsonformatter.SerializerSettings.ContractResolver
  = new CamelCasePropertyNamesContractResolver();

【讨论】:

  • 谢谢 JotaBe,这些真的很有价值,我会再试一次。
【解决方案2】:

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

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 天的时间才真正弄清楚真正的原因(据说)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多