2016-07-24 5 views
4

を発射ません:JSonConverterが、私はこのように、タイプ<code>System.Net.Mime.ContentType</code>の性質を持っている.NET 4.0で書かれた私のWebAPIのアプリケーションでモデルを、持っているC#WebAPIの中で私のモデルのプロパティの

[Serializable] 
public class FileData 
{ 
    private ContentType contentType; 
    private long size; 
    private string name; 

    public ContentType ContentType 
    { 
     get { return contentType; } 
     set { contentType = value; } 
    } 

    ... 

    /* same getter/setter logic for the other fields */ 
} 

モデルが存在します私のWebプロジェクトとは別のアセンブリで。

{ 
    "size": 12345, 
    "contentType": "image/png", 
    "name": "avatar.png" 
} 

をどのようにContentTypeを変換するために、私は私が持っているカスタムJsonConverterを登録しているJson.NETを伝えるために:

ので、クライアントは、私がこのクラスに変換する必要がJSONメッセージを送信します目的のために書かれた:上記のコードで

JsonFormatter.SerializerSettings.Converters.Add(new ContentTypeJsonConverter()); 

私はWEBAPIアプリケーションのグローバルJsonFormatter obejectを参照しています。

したがって、クライアントからJSONが送信されると、コントローラがメッセージを適切に解析することを期待しています。

残念ながら、それはエラーで失敗します。

は、「キャストまたはSystem.Net.Mime.ContentTypeに可能System.Stringから変換できませんでした。」

私は私FileDataクラスに次のコードを追加することで周りにこれを動作することができます知っている:

public class FileData 
{ 
    ... 

    [JsonConverter(typeof(ContentTypeJsonConverter))] 
    public ContentType ContentType { /* Getter and Setter */ } 
} 

が、問題は、私はFileDataアセンブリ内JSON.NETへの依存関係を導入してはならないということですタイプが存在する。

FileDataクラスを変更せずにcontentTypeメンバの正しい逆シリアル化をトリガする方法はありますか?提案何Brian Rogers私も試した上記に加えて


JsonFormatter.SerializerSettings.ContractResolver = new CustomResolver(); 

CustomResolver実装とは:

class CustomResolver : DefaultContractResolver 
{ 
    protected override JsonContract CreateContract(Type objectType) 
    { 
     var contract = base.CreateContract(objectType); 
     if (objectType == typeof(ContentType)) 
     { 
      contract.Converter = new ContentTypeJsonConverter(); 
     } 
     return contract; 
    } 
} 

結果は同じでした。

+1

を作成することができ、その後、 'FILEDATAに値をコピー'class;これにより、他のアセンブリ内のjson.netへの任意のタイプの依存関係が削除されます。 –

+1

TypeDescriptorsを調べて、実行時に属性を動的に追加することもできますが、単純なPOCOクラスよりも労力がかかり、値IMOをコピーすることになります。 –

+0

'FileData'クラスの' contentType'フィールドにpublicアクセサ/ミューテータのペアがありますか?あなたのコンバーターは 'System.Net.Mime.ContentType'型が渡されたときtrueを返すように' CanConvert'メソッドを実装していますか? –

答えて

1

以下は私のために働く(Web API 2)。

モデル:

[Serializable] 
public class FileData 
{ 
    private ContentType contentType; 

    public ContentType ContentType 
    { 
     get { return contentType; } 
     set { contentType = value; } 
    } 
} 

カスタムJSONコンバータ:

public class ContentTypeJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(ContentType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return new ContentType((string)reader.Value); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(((ContentType)value).ToString()); 
    } 
} 

コンバータ登録(WebApiConfig.cs):

public static void Register(HttpConfiguration config) 
{ 
    ... 
    config 
     .Formatters 
     .JsonFormatter 
     .SerializerSettings 
     .Converters 
     .Add(new ContentTypeJsonConverter()); 
} 

コントローラー:

public class TestController : ApiController 
{ 
    public IHttpActionResult Post(FileData data) 
    { 
     return this.Ok(data); 
    } 
} 

要求:

POST /api/test HTTP/1.1 
Content-Type: application/json 
Host: localhost:48278 
Content-Length: 36 

{ 
    "contentType": "image/png" 
} 

は応答:あなたはJsonConverter/wをただ直列化復元のために別のPOCOを直列化復元が発生したアセンブリで

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?ZDpcd29ya1xUb0REXGFwaVx0ZXN0?= 
X-Powered-By: ASP.NET 
Date: Mon, 25 Jul 2016 07:06:02 GMT 
Content-Length: 27 

{"contentType":"image/png"} 
+0

ありがとうございます。私はまだこれをテストするために孤立したプロジェクトを作成していないことを認めなければなりませんが、私の現在の設定はあなたの設定の点では非常に近く、コンバータの実装はほぼ同じです。使用しているWebAPIとJson.NETの正確なバージョンを教えてください。後日、私はあなたのコードを直接適用することができる独立したプロジェクトを作る機会を得て、それらが異なる場合には図書館のバージョンでもプレイします。 –

関連する問題