2016-06-27 1 views
0

私のモデルを私のWeb APIから正しい方法で送り返すことができません。Webアプリケーションの応答にタイプセーフな列挙型をシリアル化しますか?

私はこの例外メッセージになっています:

public class ValidationCreditReport 
    { 
     public int companyId { get; set; } 
     public string companyName { get; set; } 
     public CreditRecommendation recommendationSecure { get; set; } 
     public CreditRecommendation recommendationUnsecure { get; set; } 
     public CreditOutlook creditOutlook { get; set; } 
     public IndicativeRating indicativeCorporateRating { get; set; } 
     public IndicativeRating indicativeSeniorUnsecured { get; set; } 
     public IndicativeRating indicativeSeniorSecured { get; set; } 
     public Currency currency { get; set; } 

     public override string ToString() 
     { 
      return companyId + " " + companyName + " " + recommendationSecure.Name + " " + recommendationUnsecure.Name + " " + 
       creditOutlook.Name + " " + indicativeCorporateRating.Name + " " + indicativeSeniorSecured.Name + " " + indicativeSeniorSecured.Name + " " + currency.Name; 
     } 
    } 

そして、ここに私の列挙型である:

public class CreditRecommendation 
    { 
     public string Name{ get; set; } 
     private CreditRecommendation (string name) 
     { 
      Name = name; 
     } 

     public static CreditRecommendation Buy = new CreditRecommendation("Buy"); 
     public static CreditRecommendation Sell = new CreditRecommendation("Sell"); 
     public static CreditRecommendation Hold = new CreditRecommendation("Hold"); 
     public static CreditRecommendation NoRating = new CreditRecommendation("NoRating"); 

     public static CreditRecommendation FromName(string name) 
     { 
      switch (name) 
      { 
       case "Buy": 
        return Buy; 
       case "Sell": 
        return Sell; 
       case "Hold": 
        return Hold; 
       case "NoRating": 
        return NoRating; 
       default: 
        throw new ArgumentException("Provided name invalid: " + name); 
      } 
     } 
    }; 

残りこれは私のモデルのように見えるものである

を列挙型モデルのうち、それぞれのスイッ​​チのケースでは、同じ名前だが異なる名前と多かれ少なかれオプションがあります。

今私がしようとしてきたのは、自分のtoString()関数を記述して、列挙型を.nameと呼び、それを通常の文字列に追加する関数です。私はこの文字列をjson文字列にハードコーディングすることを考えていました。しかし、私はこれがこの問題に取り組んでこれを処理する正しい方法だとは思わない。最終的にここに

とは、私が実際に戻って私のデータを送信しようとどこです:

public HttpResponseMessage GetLastPublishedData(String companyName) 
     { 
      using (SqlConnection connection = CreateSqlConnection()) 
      { 
       using (var transaction = connection.BeginTransaction()) 
       { 
        try 
        { 
         var service = CreateCreditService(connection, transaction); 
         var msg = service.ValidateAndPrepareCreditReport(companyName); 
         var result = CreateValidationCreditReport(msg); 
         transaction.Commit(); 
         return this.Request.CreateResponse<ValidationCreditReport>(HttpStatusCode.OK, result); 
        } 
        catch{ 
         transaction.Rollback(); 
         throw; 
        } 

       } 
      } 
     } 

私はプロジェクト全体を歩いてきましたし、問題は私の列挙し、それらをシリアライズすることができないから幹のようです。

何かすべてのヘルプは大歓迎です。

+0

あなたが列挙型について話しているが、その後、あなたが私たちのクラスを示しています。私はあなたがアプローチするのを理解していません、単純な列挙子を表現するためにクラスを使用しているのはなぜですか? –

+0

@FedericoDipuma私は以前の同僚からこのコードの一部を継承しています。私はすべての設計選択について100%確信しているわけではありませんが、私はそれらを理解するために最善を尽くしています。 – Gurkang

+0

@ Gurkang - あなたはこの質問[tag:json]にタグを付けましたが、例外エラーメッセージにXMLが記述されています。あなたはどちらを使っていますか?各シリアライザで異なる動作をするシングルトンシリアライゼーションを試みています(XmlSerializerでは全く動作しません)。[XmlSerialization with a singleton](https://stackoverflow.com/questions/17667164) – dbc

答えて

1

あなたのコードにはリファクタリングが必要です。列挙型にクラスを使用することは、本当に悪い設計選択であり、利点はありません。

あなたのタイプをリファクタリングし、代わりに、単純な列挙型を使用します。あなたがそれらをあなたのJSONレスポンス内の文字列としてシリアライズしたい場合は、単にウェブAPI JSONシリアライザインスタンスに正しいコンバータを追加し、

public enum CreditRecommendation { 
    Buy, 
    Sell, 
    Hold, 
    NoRating 
} 

を次に:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add 
      (new Newtonsoft.Json.Converters.StringEnumConverter()); 

と仮定すると、configHttpConfigurationインスタンスです。

+0

ありがとう私は、各列挙型クラスのために空のコンストラクタを追加してシリアル化を行っています。私はリファクタリングする必要がある場合、または私たちがどのように進めるべきか、私の上司に話します! – Gurkang

0

各列挙型クラスの空のコンストラクタを追加することで、問題なく動作します。

だから、次のようになりますCreditRecommendationクラスのために:

public CreditRecommendation() { } 
関連する問題