![](/img/trans.png)
[英]How do I deserialize from JSON to an abstract parameter on an ASP.NET MVC 5 controller
[英]Failing to deserialize json into abstract class in ASP.Net MVC
我知道关于这个问题有很多疑问和答案,但是没有一个帮助我。
我有2个类,它们从一个抽象基类继承。 我试图在将基类作为参数的控制器中编写POST方法,但出现异常:
MissingMethodException:无法创建抽象类。
我在以下答案中找到了解决方案: 在Asp.Net Web API中将Json反序列化为派生类型 ,但这没有帮助。
我喜欢这个主意,并一直遵循答案直到最后,但是仍然遇到了同样的异常,并且从未调用过我的代码。
为了找出问题所在,我启动了新的ASP.NET项目(SPA模板),并在干净的项目上检查了我的问题。 我的实现:
我的JsonConverter实现与答案的形式相同:
public abstract class JsonCreationConverter<T> : JsonConverter
{
/// <summary>
/// this is very important, otherwise serialization breaks!
/// </summary>
public override bool CanWrite => false;
/// <summary>
/// Create an instance of objectType, based properties in the JSON object
/// </summary>
/// <param name="objectType">type of object expected</param>
/// <param name="jObject">contents of JSON object that will be
/// deserialized</param>
/// <returns></returns>
protected abstract T Create(Type objectType, JObject jObject);
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
//////////////////////////////////////////
// This function never get called!!!!!!!!!
//////////////////////////////////////////
if (reader.TokenType == JsonToken.Null)
return null;
// Load JObject from stream
JObject jObject = JObject.Load(reader);
// Create target object based on JObject
T target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
我的基类及其实现是:
[JsonConverter(typeof(MyCustomConverter))]
public abstract class BaseClass
{
private class MyCustomConverter : JsonCreationConverter<BaseClass>
{
protected override BaseClass Create(Type objectType,
Newtonsoft.Json.Linq.JObject jObject)
{
//////////////////////////////////////////
// No matter what I put in here.
// This function never get called!!!!!!!!!
//////////////////////////////////////////
return new Sub1()
{
Name = "aaaa",
Prop1 = 233
};
}
}
public int Prop1 { get; set; }
}
public class Sub1 : BaseClass
{
public string Name { get; set; }
}
我的控制器Post和Get方法是:
// GET: /Account/GetTest
[HttpGet]
public JsonResult GetTest()
{
// This function works as expected.
Sub1 sub1 = new Sub1
{
Name = "SomeName",
Prop1 = 5
};
return Json(sub1, JsonRequestBehavior.AllowGet);
}
// Post: /Account/PostTest
[HttpPost]
public JsonResult PostTest(BaseClass res)
{
// I never get to this point.
return Json(res, JsonRequestBehavior.AllowGet);
}
而我尝试使用此API的JS测试代码是:
$.ajax({
url: '/Account/GetTest',
method: 'get',
cache: false,
success: function(data) {
// data arrive fine to this point
$.ajax({
url: '/Account/PostTest',
method: 'post',
cache: false,
data: data,
// I've also tried: data: JSON.stringify(data),
success: function () {
// I never get success...
alert('Success');
},
error: function () {
alert('Error Post');
}
});
},
error: function() {
alert('Error Get');
}
});
我也尝试过使用ajax参数,但是没有任何运气。
有人知道我在做什么错吗?
using (WebClient client = new WebClient())
{
response = Newtonsoft.Json.Linq.JObject.Parse(client.DownloadString(fullUrl));
}
Newtonsoft.Json.Linq.JArray items = response.items;
Newtonsoft.Json.Linq.JArray selectedItems = new JArray();
foreach (dynamic rev in reviews)
{
if (rev.propertyWanted == "condition")
{
selectedReviews.Add(rev);
}
else
{
continue;
}
}
return selectedReviews;
经过多次实验,我发现在基类上使用JsonConverter属性仅在ApiController中起作用 ,而在常规MVC Controller中不起作用 。 我刚刚创建了新的ApiController,它就像一个魅力。
另外,发布json时,它应包含contentType信息,因此应如下所示:
$.ajax({
url: '/Account/PostTest',
method: 'post',
cache: false,
//////// NOTE THE NEXT 2 ATTRIBUTES
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8'
/////////////////
success: function () {
// I never get success...
alert('Success');
},
error: function () {
alert('Error Post');
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.