2016-09-29 9 views
0

私はwebApiで使用しているモデルを持っています。私のモデルは以下の通りです。JsonConverter nullモデル全体

public class Model: IModel 
{ 
    public string Data1 { get; set; } 

    public string Data2 { get; set; } 

    public int DataInt { get; set; } 
    [JsonConverter(typeof(JsonConcreteTypeConverter<MyObject>))] 
    public List<IMyObject> DataObjects { get; set; }  
    } 
} 

このインタフェースを逆シリアル化するために、私は自分のjsonConverterクラスを次のように作成しました。

public class JsonConcreteTypeConverter<TConcreteType>: JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 

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

    public override bool CanConvert(Type objectType) 
    { 
     bool result; 

     if (objectType == typeof(MyObject)) 
     { 
      result = true; 
     } 
     else 
     { 
      result = false; 
     } 
     return result; 
    } 
} 

そして、これは私がいる問題は、私はこのjsonConverterを使用する場合シリアライザは、モデルをデシリアライズすることができないと私はWEBAPIを呼び出すときに、私は内部のヌル得るということであるコントローラ

[HttpPost] 
[Route("api/{ObjectId}/Action")] 
public IHttpActionResult RunAsyncAction([FromBody] Model action) 
{ 
    IModel modelAction = action; 
    //Other code 
    return Content(HttpStatusCode.Accepted, OPERATION_ACCEPTED_MESSAGE); 
} 

ですFromBodyを取得する「アクション」オブジェクト。私がJsonConverterを削除した場合は、シリアライザがデシリアライズできないため、インターフェイスがnullの場合を除いて、すべて正しくシリアル化されます。 JSONは呼び出し時に正しくフォーマットされています。ありがとう

+0

提供されているタイプを使用しない場合、汎用コンバータのポイントは何ですか? – kiziu

+0

@kiziuコードを修正しました。コードを貼り付ける際にエラーが発生しました。コードは問題にあるとおりです。デシリアライズがnullを返しています – acostela

+0

あなたはまだ 'CanConvert'にエラーがありますが、それは今は関係ありません。あなたはシリアル化プロセスで普通のことはありませんか?私は 'JsonConvert.SerializeObject'を使って' Model'をシリアル化しました。これはうまくいきました(私はちょっとした 'IMyObject'と' MyObject'を作成しました)。私が今言うこともできるのは、あなたの 'JsonConverter'が計画どおりに動作しないということです。コレクション内の項目には適用されませんが、コレクション全体(属性でマークされたプロパティへ)に適用されます。 – kiziu

答えて

1

あなたJsonConverterの実装では、あなたがReadJson()readerからの単一のインスタンスデシリアライズをしようとしているが、それは、コンバータは、の直列化復元を扱う必要があることを意味して実際にreaderは、ArrayStartの位置にあるように、期待通りに動作しません単一の項目だけでなく、配列全体。つまり、JsonConverterは装飾されたメンバーのタイプの逆シリアル化を処理する必要があります。

あなたのケースでは、コンバーターを配列アイテムとして使用します。正しく動作させるには、別の属性-とそのプロパティーItemConverterTypeを使用する必要があります。結果は次のようになります。

[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))] 
public List<IMyObject> DataObjects { get; set; } 

これは、アレイ全体ではなく、アイテムを逆シリアル化する際にコンバーターを正しく適用します。

また、デシリアライザで1つの実装しか処理できない場合は、具体的にはModelのインターフェイスのポイントは何ですか?

if (objectType == typeof(MyObject))も修正する必要があります。TConcreteTypeを使用してください。

PS。コメントに関しては、当初私はJsonProperty.ItemConverterTypeを忘れていたので、JsonConverterをリストと連携させたいと思っていました。これは正しい方法です。

+0

私はそのインターフェースに複数の実装を持っているので、私はモデルにインターフェースを持っています。私はWebApiを反復的に開発しており、最初の実装ではそのタイプのみをサポートしています。次のステップでは、より多くのタイプをサポートします。それが正常に動作しているあなたの時間をありがとう – acostela

関連する問題