2016-04-08 6 views
0

私はこの1つのバック同様のオブジェクトを取得するにはWebAPIの呼び出しを作っています:なぜ私のICollectionのアイテムがWebAPIコールのヌルであるのですか?<Interface>?

public class DocumentCategoryModel : IDocumentCategoryTree 
    { 
     public DocumentCategoryModel() 
     { 
      SubCategories = new List<IDocumentCategoryTree>(); 
     } 

     public int ID { get; set; } 
     public ICollection<IDocumentCategoryTree> SubCategories { get; set; } 
    } 

IDおよびその他のプロパティが正しく装着されています。 SubCategories propは正しいサイズのコレクションを持ちますが、すべてのエントリはnullです。

理由は何ですか?私はそれを具体的なタイプのコレクションにすることはできませんが、WebAPIはどのクラスを使用するべきかを理解することができます。

+0

「SubCategories」コレクションに入れるオブジェクトの種類をWebAPIがどのように知っていると思いますか? – StriplingWarrior

+2

私はこの声明を理解していません。「私はそれを具体的なタイプのコレクションにすることはできませんが、WebAPIはどのクラスを使うべきかを理解することができます。 *あなたの問題は、JSONデシリアライザがインターフェイスにデシリアライズすることはできません。どのようにそれを伝えない限り、すべての型を検索してどの具体的なクラスをインスタンス化するかを判断できません。 – CodingGorilla

+0

@ CodeGorillaデシリアライズする方法を教えてください。 –

答えて

1

この回答は、ASP.NET WebAPIのデフォルトであるJSON.netを使用していることを前提としています。 JSON.netはIDocumentCategoryTreeの具体的なインスタンスを作成する方法を理解していないので、自動的にそれを逆シリアル化することはできません。

public class DocumentCategoryModel : IDocumentCategoryTree 
{ 
    public DocumentCategoryModel() 
    { 
     SubCategories = new List<IDocumentCategoryTree>(); 
    } 

    public int ID { get; set; } 

    [JsonConverter(typeof(DocumentCategoryTreeConverter)] 
    public ICollection<IDocumentCategoryTree> SubCategories { get; set; } 
} 

public class DocumentCategoryTreeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // Todo if desired 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return serializer.Deserialize<TestTree>(reader); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     // Todo 
    } 
} 

これは、あなたがこれを行うことができますどのようにアイデアを与えるために非常に単純化し、不完全な例は次のとおりです。だから、このyouself、あなたのクラスのJsonConverterを使用しているIがこれを行うような方法を実行する必要がありますあなたを始めましょう。 JsonConverterの詳細については、他のSOの投稿(How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?)で読むことができます。

+0

私は同様のことをしました。私はJsConfig .RawDeserializeFn =(value)=> {return JsonSerializer.DeserializeFromString (value);}を使用しました。 しかし、私はいくつかのレベルを深く取得すると、値は再びnullです... –

0

XMLとJSONのシリアル化/デシリアライズは、クラス。コンクリートがなければ、それを適切に直列化する方法はわかりません。 DocumentCatTreeApiModelのようなものをIDocumentCategoryTreeのコンクリートにすることをおすすめします。これにより、シリアル化プロセスが適切に機能します。

関連する問題