2017-08-03 125 views
0

所以我編碼一個tcp/ip聊天,我想用json.net序列化消息,所以我可以通過網絡發送它。反序列化JSON.NET不知道類型

我得到了這兩種類型的消息:

class AlertMessage 
{ 
    public string Client { get; set; } 
    public ServerManager.Status Status { get; set; } //enum {Connect, Disconnect} 
} 

class TextMessage 
{ 
    public string Client { get; set; } 
    public string Message { get; set; } 
} 

反序列化,我需要使用的方法JsonConvert.DeserializeObject<T>(object),但在客戶端上我不能真的告訴到達什麼類型,任何幫助,歡迎!謝謝

+1

反序列化到像'類信息更通用類 { 公共字符串的客戶{獲得;組; } public ServerManager.Status狀態{get;組; } \t public string Message {get;組; }現在,您可以測試屬性並相應地使用 –

+1

我會說沒有從同一端點返回不同類型的API ...如果您的目標是強類型語言,則不會。也許重新考慮你的信息。 –

回答

0

不知道我是否已經正確理解你的問題,但你可以反序列化它作爲動態對象。例如:

var converter = new ExpandoObjectConverter(); dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);

0

如果你不知道你會得到json的想法,你可以使用

using System.Web.Script.Serialization; 

命名空間。 (輕鬆搜索並添加此參考)

我使用下面的代碼將任何對象轉換爲有效的json對象。

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Dynamic; 
using System.Linq; 
using System.Text; 
using System.Web.Script.Serialization; 

namespace MinimalMonitoringClient.Helper 
{ 
    public sealed class DynamicJsonConverter : JavaScriptConverter 
    { 
     public static object ConvertToObject(string data) 
     { 
      var serializer = new JavaScriptSerializer(); 
      serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); 
      return serializer.Deserialize(data, typeof(object)); 
     } 

     private static string CleanJson(string data) 
     { 
      //Remove leading and ending whitespaces. 
      data = data.Trim(); 

      //Java Script notation fixes 
      if(data.StartsWith("[")) 
       data = data.Remove(0, 1); 
      if(data.EndsWith("]")) 
       data = data.Remove(data.Length - 1, 1); 
      return data.Contains("={") ? data.Replace("={", ":{") : data; 
     } 

     public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
     { 
      if (dictionary == null) 
       throw new ArgumentNullException("dictionary"); 

      return type == typeof(object) ? new DynamicJsonObject(dictionary) : null; 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override IEnumerable<Type> SupportedTypes 
     { 
      get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); } 
     } 

     #region Nested type: DynamicJsonObject 

     private sealed class DynamicJsonObject : DynamicObject 
     { 
      private readonly IDictionary<string, object> _dictionary; 

      public DynamicJsonObject(IDictionary<string, object> dictionary) 
      { 
       _dictionary = dictionary ?? throw new ArgumentNullException("dictionary"); 
      } 

      public override string ToString() 
      { 
       var sb = new StringBuilder("{"); 
       ToString(sb); 
       return sb.ToString(); 
      } 

      private void ToString(StringBuilder sb) 
      { 
       var firstInDictionary = true; 
       foreach (var pair in _dictionary) 
       { 
        if (!firstInDictionary) 
         sb.Append(","); 
        firstInDictionary = false; 
        var value = pair.Value; 
        var name = pair.Key; 
        if (value is string) 
        { 
         sb.AppendFormat("{0}:\"{1}\"", name, value); 
        } 
        else if (value is IDictionary<string, object>) 
        { 
         new DynamicJsonObject((IDictionary<string, object>)value).ToString(sb); 
        } 
        else if (value is ArrayList) 
        { 
         sb.Append(name + ":["); 
         var firstInArray = true; 
         foreach (var arrayValue in (ArrayList)value) 
         { 
          if (!firstInArray) 
           sb.Append(","); 
          firstInArray = false; 
          if (arrayValue is IDictionary<string, object>) 
           new DynamicJsonObject((IDictionary<string, object>)arrayValue).ToString(sb); 
          else if (arrayValue is string) 
           sb.AppendFormat("\"{0}\"", arrayValue); 
          else 
           sb.AppendFormat("{0}", arrayValue); 

         } 
         sb.Append("]"); 
        } 
        else 
        { 
         sb.AppendFormat("{0}:{1}", name, value); 
        } 
       } 
       sb.Append("}"); 
      } 

      public override bool TryGetMember(GetMemberBinder binder, out object result) 
      { 
       if (!_dictionary.TryGetValue(binder.Name, out result)) 
       { 
        // return null to avoid exception. caller can check for null this way... 
        result = null; 
        return true; 
       } 

       result = WrapResultObject(result); 
       return true; 
      } 

      public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) 
      { 
       if (indexes.Length == 1 && indexes[0] != null) 
       { 
        if (!_dictionary.TryGetValue(indexes[0].ToString(), out result)) 
        { 
         // return null to avoid exception. caller can check for null this way... 
         result = null; 
         return true; 
        } 

        result = WrapResultObject(result); 
        return true; 
       } 

       return base.TryGetIndex(binder, indexes, out result); 
      } 

      private static object WrapResultObject(object result) 
      { 
       var dictionary = result as IDictionary<string, object>; 
       if (dictionary != null) 
        return new DynamicJsonObject(dictionary); 

       var arrayList = result as ArrayList; 
       if (arrayList != null && arrayList.Count > 0) 
       { 
        return arrayList[0] is IDictionary<string, object> 
         ? new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x))) 
         : new List<object>(arrayList.Cast<object>()); 
       } 

       return result; 
      } 
     } 

     #endregion 
    } 
} 

現在只需將任何JSON成一個對象與

object jsonObject = DynamicJsonConverter.ConvertToObject(Json); 

希望幫助

+0

我是新來的c#所以有很多東西,我不明白抱歉,我一直在尋找與我一樣的問題,我發現這個答案https://stackoverflow.com/a/38680249/7872624雖然在最後一步我仍然需要將對象轉換爲從json中提取的數據類型,我怎麼能這樣做呢? –

+0

(ClassToCastTo)objectToCast;或者只是使用JsonConvert.Deserialize (...); –