をJSONをデシリアライズに失敗私は、この問題に関する質問と回答がたくさんある知っているが、どれも私を助けてくれません。はASP.Net MVCで抽象クラスに
私は1つの抽象基本クラスから継承する2つのクラスを持っています。私はパラメータとして基本クラスを取得する私のコントローラにPOSTメソッドを書き込もうとしていますが、例外があります。
MissingMethodException:抽象クラスを作成できません。
答え:Deserialising Json to derived types in Asp.Net Web APIが見つかりましたが、役に立たなかったです。
私はアイデアが好きで、最後までそこに答えが続くが、それでも、同じ例外を持って、自分のコードが呼び出されることはなかったです。
問題を特定するために、私は新しい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; }
}
私のコントローラのポストと方法がありなさい:
// 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パラメータを使用してプレイしようとしましたが、運がありません。
誰かが私が間違っているのか知っていますか?多くの実験の後
'BaseClass'が抽象的である私は仮定しますか? – DavidG
これは非常に奇妙な、と呼ばれていない、あなたが書いているこれらのメソッドが呼ばれるべきです - あなたはまだその同じ例外を得ていますか? – gilmishal
私のコードでわかるように、BaseClassは抽象です。 それは変です。私は今2日間それを把握しようとしています。私はまったく同じ例外を取得します... – Havivi