【发布时间】:2019-12-24 22:45:38
【问题描述】:
我在控制器中有一个动作,它的参数类型为Class1
[HttpPost]
public IActionResult Create(Class1 c)
{
}
我使用 JQuery 的 Ajax 函数向它发送数据。
我想编写自己的代码来反序列化SampleProperty:
class Class1
{
public string SampleProperty { get; set; }
}
有可能吗?我想覆盖默认反序列化。
我尝试了很多东西,例如写转换器:
public class SamplePropertyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if ((string)existingValue == "abc")
return "abc123";
else
return existingValue;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => false;
public override bool CanRead => true;
}
然后像这样使用它:
class Class1
{
[JsonConverter(typeof(SamplePropertyConverter))]
public string SampleProperty { get; set; }
}
但在这种情况下,SamplePropertyConverter 根本不被使用。
我也尝试在Startup中添加它,但后来我看到它进入CanConvert方法,但仅用于其他一些请求,而不是发送Class1到CreateAction。
【问题讨论】:
-
我认为您需要在asp.net-core 中显式使用
[FromBody],然后将Class1数据作为JSON 发布到请求正文中。如果请求数据为x-www-form-urlencoded,则不会使用 JSON 转换器。请参阅:Confused with FromBody in ASP.NET Core。 -
另外,您的
ReadJson()有一个错误。existingValue是Class1.SimpleProperty的当前值,因为它正在被反序列化(例如,它已在构造函数中设置),不是正在读取的值。请参阅:Json.Net Is converting on its own before using my JsonConverter。 -
@dbc 非常感谢
[FromBody]和contentType: 'application/json; charset=utf-8'的提示。然后JsonConverter开始被调用!但为了实现这一点,我还需要JSON.stringify我的对象,因为 JQuery 没有自动将它转换为 Json,它仍然像x-www-form-urlencoded一样编写。
标签: c# ajax asp.net-core json.net