2017-08-03 16 views
0

私はtcp/ipチャットをコーディングしています。json.netを使用してメッセージをシリアル化してネットワーク経由で送信できるようにしたいと考えています。私はこの方法JsonConvert.DeserializeObject<T>(object)を使用する必要がデシリアライズするタイプを知らない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; } 
} 

が、私は本当に到着したどのようなタイプ伝えるカント、クライアント側では、すべてのヘルプは大歓迎です。

は、私は、メッセージのこれらの2つのタイプを持って!ありがとう

+1

デシリアライズを助け

object jsonObject = DynamicJsonConverter.ConvertToObject(Json); 

希望を持つオブジェクトに任意のJSONに変換します。セット; } パブリックServerManager.Statusステータス{get;セット; } \t public string Message {get;セット; } } 'プロパティをテストしてそれに応じて使用できます –

+1

厳密に型指定された言語をターゲットにしているのではなく、同じエンドポイントからさまざまな型を返すAPIがないと言うでしょう。おそらくあなたのメッセージを再考するでしょう。 –

答えて

0

私はあなたの質問を正しく理解しているかどうかはわかりませんが、オブジェクトを動的に逆シリアル化できます。たとえば:あなたはあなたが受け取るしようとしているJSONについては考えている場合は

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

0

、あなたは

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 
    } 
} 

今単に{取得 `クラスのメッセージ { パブリック文字列クライアントのようなより一般的なクラスに

+0

私はC#にちょっと新しくなっているので、大変申し訳ありませんが、私は私と同じ質問を探していましたが、私はこの回答を見つけました。https://stackoverflow.com/a/38680249/7872624最後のステップはまだjsonから抽出したデータ型にオブジェクトをキャストする必要があります。 –

+0

(ClassToCastTo)objectToCast;または、JsonConvert.Deserialize (...)を使用します。 –

関連する問題