Dot-Net

通用 WCF JSON 反序列化

  • August 28, 2017

我對 WCF 有點陌生,並將嘗試清楚地描述我正在嘗試做的事情。

我有一個使用 JSON 請求的 WCF 網路服務。在大多數情況下,我在發送/接收 JSON 方面做得很好。例如,以下程式碼執行良好且符合預期。

發送的 JSON:

{ "guy": {"FirstName":"Dave"} }

周轉基金:

   [DataContract]
   public class SomeGuy
   {
       [DataMember]
       public string FirstName { get; set; }
   }

   [OperationContract]
   [WebInvoke(Method = "POST",
              BodyStyle = WebMessageBodyStyle.WrappedRequest,
              RequestFormat = WebMessageFormat.Json,
              ResponseFormat = WebMessageFormat.Json)]
   public string Register(SomeGuy guy)
   {
       return guy.FirstName;
   }

這將按預期返回一個帶有“Dave”的 JSON 對象。問題是我不能總是保證我收到的 JSON 將與我的 DataContract 中的成員完全匹配。例如,JSON:

{ "guy": {"firstname":"Dave"} }

由於大小寫不匹配,將無法正確序列化。guy.FirstName 將為空。這種行為是有道理的,但我真的不知道如何解決這個問題。我是否必須在客戶端強制使用欄位名稱,還是有辦法在伺服器端進行協調?

一個可能相關的問題:我可以接受通用 JSON 對象並將其序列化為 StringDictionary 或某種簡單的鍵值結構嗎?所以無論在 JSON 中發送什麼欄位名稱,我都可以訪問已發送給我的名稱和值嗎?現在,我可以讀取我收到的數據的唯一方法是它是否與預定義的 DataContract 完全匹配。

這是將 json 讀入字典的另一種方法:

[DataContract]
public class Contract
   {
   [DataMember]
   public JsonDictionary Registration { get; set; }
   }

[Serializable]
public class JsonDictionary : ISerializable
   {
   private Dictionary<string, object> m_entries;

   public JsonDictionary()
       {
       m_entries = new Dictionary<string, object>();
       }

   public IEnumerable<KeyValuePair<string, object>> Entries
       {
       get { return m_entries; }
       }

   protected JsonDictionary(SerializationInfo info, StreamingContext context)
       {
       m_entries = new Dictionary<string, object>();
       foreach (var entry in info)
           {
           m_entries.Add(entry.Name, entry.Value);
           }
       }

   public void GetObjectData(SerializationInfo info, StreamingContext context)
       {
       foreach (var entry in m_entries)
           {
           info.AddValue(entry.Key, entry.Value);
           }
       }
   }

引用自:https://stackoverflow.com/questions/2297903