我的 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 对象。然后我可以从中创建一个人对象。希望这对您有所帮助
你的代码有几个问题:
- 反序列化是区分大小写的,所以JS端的属性必须和服务端的属性大小写一致
- 你需要直接将人物对象作为参数传递,而不是作为对象的
person
属性包含
- 虽然通常不会有什么坏处,但您不需要对对象进行字符串化。 jQuery
ajax
会自动为您完成
关于 1,您可以设置 Web API 序列化程序将服务器端 PascalCase 转换为客户端驼峰式,反之亦然,但是在转换 属性 客户端和服务器端之间的名称:
var jsonformatter
= GlobalConfiguration.Configuration.Formatters.JsonFormatter;
jsonformatter.SerializerSettings.ContractResolver
= new CamelCasePropertyNamesContractResolver();
这是我的客户代码
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 对象。然后我可以从中创建一个人对象。希望这对您有所帮助
你的代码有几个问题:
- 反序列化是区分大小写的,所以JS端的属性必须和服务端的属性大小写一致
- 你需要直接将人物对象作为参数传递,而不是作为对象的
person
属性包含 - 虽然通常不会有什么坏处,但您不需要对对象进行字符串化。 jQuery
ajax
会自动为您完成
关于 1,您可以设置 Web API 序列化程序将服务器端 PascalCase 转换为客户端驼峰式,反之亦然,但是在转换 属性 客户端和服务器端之间的名称:
var jsonformatter
= GlobalConfiguration.Configuration.Formatters.JsonFormatter;
jsonformatter.SerializerSettings.ContractResolver
= new CamelCasePropertyNamesContractResolver();