簡單實體Json序列化(輸出JSON的屬性可變)

簡單實體Json序列化(輸出JSON的屬性可變)javascript

 

1、先看效果java

 

 

能夠看出 , 咱們在序列化一個對像時, 只給出了 咱們想要 輸出的兩個字段名,  實際實體有5個屬性, 通過可變屬性序列化後的JSON 結果,也是咱們想要的。web

 

2、正式上程序json

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace TaskConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {


            var p = new Person { Age = 20, Name = "jinshuai", Meney = 3, Tex = 1, Berthday = DateTime.Now };

            var s = new PropertyVariableJsonSerializer();

            var result = s.Serialize<Person>(p, new List<string>() { "Name", "Age" });


            Console.WriteLine(result);
        


            Console.WriteLine("----------------------------");

            Console.Read();
            
        }
    }

 

 1   public class Person
 2     {
 3         public string Name { get; set; }
 4 
 5         public int Age { get; set; }
 6 
 7         public double Meney { get; set; }
 8 
 9         public double Tex { get; set; }
10 
11         public DateTime Berthday { get; set; }
12 
13     }

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Web.Script.Serialization;
 6 
 7 namespace TaskConsoleApplication
 8 {
 9 
10     /// <summary>
11     ///簡單實體 可變屬性序列化器
12     /// </summary>
13     public class PropertyVariableJsonSerializer
14     {
15         readonly JavaScriptSerializer _serializer = new JavaScriptSerializer();
16 
17         /// <summary>
18         /// json 序列化
19         /// </summary>
20         /// <typeparam name="T"></typeparam>
21         /// <param name="obj"></param>
22         /// <param name="propertys"></param>
23         /// <returns></returns>
24         public string Serialize<T>(T obj,List<string> propertys)
25         {
26             _serializer.RegisterConverters(new[] { new PropertyVariableConveter(typeof(T), propertys) });
27 
28             return _serializer.Serialize(obj);
29 
30         }
31     }
32 
33 
34     public class PropertyVariableConveter : JavaScriptConverter
35     {
36         private readonly List<Type> _supportedTypes = new List<Type>();
37 
38         public PropertyVariableConveter(Type supportedType, List<string> propertys)
39         {
40             _supportedTypes.Add(supportedType);
41             Propertys = propertys;
42 
43         }
44 
45 
46         private List<string> Propertys { get; set; }
47 
48 
49         public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
50         {
51 
52             throw new Exception("  這個暫時不支持 , 謝謝 ");
53 
54         }
55 
56         public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
57         {
58             var dic = new Dictionary<string, object>();
59 
60             var t = obj.GetType();
61              var properties= t.GetProperties();
62 
63              foreach (var ite in properties)
64              {
65                  string key = ite.Name;
66                  var v = t.GetProperty(key).GetValue(obj, null);
67 
68                  if (Propertys == null || Propertys.Count<=0)
69                  {
70                      dic.Add(key, v);
71                      continue;
72                  }
73 
74                  if (Propertys.Contains(key))
75                  {
76                      dic.Add(key, v);
77                  }
78              }
79 
80             return dic;
81 
82         }
83 
84         public override IEnumerable<Type> SupportedTypes
85         {
86             get { return _supportedTypes; }
87         }
88     }
89 }

 

嗯。 就這些吧。 只是玩玩而以。 app

 

此次 源代碼 就不上了。ide

 

 

附:函數

 

使用 JavaScriptConverter 類能夠爲 JavaScriptSerializer 類自己不支持的託管類型實現序列化和反序列化進程。此外,若是須要對序列化和反序列化進程進行更多控制,還可使用 JavaScriptConverter。ui

SupportedTypes 屬性指示自定義轉換器爲其提供轉換器服務的類型。spa

若要指示 JavaScriptSerializer 實例必須使用自定義轉換器,必須向該實例註冊該轉換器。若是要直接使用 JavaScriptSerializer 類,則應使用RegisterConverters 方法註冊該轉換器。不然,若是要從 ECMAScript (JavaScript) 調用 Web 方法而且但願使用自定義轉換器,則能夠經過在配置文件中添加 converters 元素來註冊該轉換器。有關詳細信息,請參閱How to: Configure ASP.NET Services in Microsoft Ajax3d

當 JavaScriptSerializer 實例序列化自身註冊有自定義轉換器的類型時,序列化程序將調用 Serialize 方法。一樣,若是 JavaScriptSerializer 實例正在反序列化 JavaScript 對象符號 (JSON) 字符串而且識別出該 JSON 字符串中的某個類型具備與其關聯的自定義轉換器,序列化程序也將調用Deserialize 方法。

 

 

構造函數
 
 
  名稱 說明
System_CAPS_protmethod JavaScriptConverter()

初始化 JavaScriptConverter 類的新實例。

屬性
 
 
  名稱 說明
System_CAPS_pubproperty SupportedTypes

當在派生類中重寫時,獲取受支持類型的集合。

方法
 
 
  名稱 說明
System_CAPS_pubmethod Deserialize(IDictionary<String, Object>, Type, JavaScriptSerializer)

當在派生類中重寫時,將所提供的字典轉換爲指定類型的對象。

System_CAPS_pubmethod Equals(Object)

肯定指定的對象是否等於當前對象。(從 Object 繼承。)

System_CAPS_protmethod Finalize()

在垃圾回收將某一對象回收前容許該對象嘗試釋放資源並執行其餘清理操做。(從 Object 繼承。)

System_CAPS_pubmethod GetHashCode()

做爲默認哈希函數。(從 Object 繼承。)

System_CAPS_pubmethod GetType()

獲取當前實例的 Type。(從 Object 繼承。)

System_CAPS_protmethod MemberwiseClone()

建立當前 Object 的淺表副本。(從 Object 繼承。)

System_CAPS_pubmethod Serialize(Object, JavaScriptSerializer)

當在派生類中重寫時,生成名稱/值對的字典。

System_CAPS_pubmethod ToString()

返回表示當前對象的字符串。(從 Object 繼承。)

 

 

此次夠 150 字了吧。 

相關文章
相關標籤/搜索