简单实体Json序列化(输出JSON的属性可变)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单实体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 方法。

 

 

 名称说明
技术分享 JavaScriptConverter()

初始化 JavaScriptConverter 类的新实例。

属性
 
 
 名称说明
技术分享 SupportedTypes

当在派生类中重写时,获取受支持类型的集合。

方法
 
 
 名称说明
技术分享 Deserialize(IDictionary<String, Object>, Type, JavaScriptSerializer)

当在派生类中重写时,将所提供的字典转换为指定类型的对象。

技术分享 Equals(Object)

确定指定的对象是否等于当前对象。(从 Object 继承。)

技术分享 Finalize()

在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(从 Object 继承。)

技术分享 GetHashCode()

作为默认哈希函数。(从 Object 继承。)

技术分享 GetType()

获取当前实例的 Type。(从 Object 继承。)

技术分享 MemberwiseClone()

创建当前 Object 的浅表副本。(从 Object 继承。)

技术分享 Serialize(Object, JavaScriptSerializer)

当在派生类中重写时,生成名称/值对的字典。

技术分享 ToString()

返回表示当前对象的字符串。(从 Object 继承。)

 

 

这次够 150 字了吧。 

 

以上是关于简单实体Json序列化(输出JSON的属性可变)的主要内容,如果未能解决你的问题,请参考以下文章

序列化后的json串与解析json串实体间的关系

如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?

是否有一个 XML 或 JSON 序列化器知道使用哪个构造函数来填充不可变对象并序列化 IEnumerable<> 属性? [关闭]

java实体转json忽略属性

将 JSON 包反序列化为具有自定义属性名称的类

jackson 实体转json 为NULL或者为空不参加序列化