2016-08-11 20 views
2

を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パラメータを使用してプレイしようとしましたが、運がありません。

誰かが私が間違っているのか知っていますか?多くの実験の後

+0

'BaseClass'が抽象的である私は仮定しますか? – DavidG

+0

これは非常に奇妙な、と呼ばれていない、あなたが書いているこれらのメソッドが呼ばれるべきです - あなたはまだその同じ例外を得ていますか? – gilmishal

+0

私のコードでわかるように、BaseClassは抽象です。 それは変です。私は今2日間それを把握しようとしています。私はまったく同じ例外を取得します... – Havivi

答えて

0

、私は、基本クラスで使用してJsonConverter属性のみApiControllerではなく、定期的なMVC コントローラに動作することを発見しました。私はちょうど新しいApiControllerを作成しましたが、それは魅力的に機能しました。

プラス、JSONを投稿whensは、それがの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'); 
     } 
    }); 
0
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; 
+0

これは私が何を探しているのですか?私はいつもjsonの文字列を取得し、手動で基本クラスに解析することができますが、私は汎用メソッドを探しています... – Havivi

関連する問題