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


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

 

一、先看效果

 

 

可以看出 , 我們在序列化一個對像時, 只給出了 我們想要 輸出的兩個字段名,  實際實體有5個屬性, 經過可變屬性序列化后的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 }

 

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

 

這次 源代碼 就不上了。

 

 

附:

 

使用 JavaScriptConverter 類可以為 JavaScriptSerializer 類本身不支持的托管類型實現序列化和反序列化進程。此外,如果需要對序列化和反序列化進程進行更多控制,還可以使用 JavaScriptConverter。

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

若要指示 JavaScriptSerializer 實例必須使用自定義轉換器,必須向該實例注冊該轉換器。如果要直接使用 JavaScriptSerializer 類,則應使用RegisterConverters 方法注冊該轉換器。否則,如果要從 ECMAScript (JavaScript) 調用 Web 方法並且希望使用自定義轉換器,則可以通過在配置文件中添加 converters 元素來注冊該轉換器。有關詳細信息,請參閱How to: Configure ASP.NET Services in Microsoft Ajax

當 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 字了吧。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM