简单实体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 字了吧。

时间: 2024-10-10 23:33:15

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

[简约webAPI]分别以asp|jsp|php简单粗暴实现webAPI,输出json数据

原本打算使用golang编写一个RESTful API,但因为环境所限,此次采用“偷懒的方式”,其实也不算偷懒,至少编写代码上面没有偷懒,只是在部署上偷懒了,三台机器物理地址以及公网地址均不同,说白了就是这三玩意儿没在一块,嘛都没在,好嘛,服务器环境也均然不同,分别为asp.java.php编写部署的系统. 既然都是脚本语言,那就暴力解决此次问题,灵活性毕竟很高嘛. ASP+sqlServer 废话不多说上代码 <%@LANGUAGE="VBSCRIPT" CODEPAGE=&q

JSON序列化 解析JSON

var book = { title : "JavaScript", authors : ["Nickolas . Zakas"], edition : 3, year : 2011 }, jsonText; JSON序列化 //简单序列化 SON.stringify接受3个参数 第一个需要序列化的对象 第二个参数是一个过滤器 可以是数组也可以是一个函数 jsonText = JSON.stringify( book ); //过滤 结果只包含过滤器中的字段 jso

JSON 序列化 和 JSON 反序列化

// JSON 序列化 (OC 数据转换成 JSON 数据) - (void)json { // 序列化:将OC数据类型转换成json数据类型. // 只有数组/字典才可以转换成 json 数据. NSDictionary *dict = @{@"name":@"zhangsan",@"age":@"18",@"sanwei":@"29"}; NSArray *array = @[@&q

Json序列化Newtonsoft.Json版本需要7.0以上

/// <summary> /// 将DataTable 转换成JSon字符串 /// </summary> /// <param name="table"></param> /// <returns></returns> public static string DataTableToJsonWithJavaScriptSerializer(DataTable table) { JavaScriptSeriali

C#中的二进制序列化和Json序列化

序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在类定义的前面加Serializable关键字),而且它的父类类型也必须是可序列化的,经过查看发现,Dotnet中很多类型和结构都有这个标记:而Json序列化不用写标记: 2.如果类中某些属性不希望被二进制序列化,加NonSerialized关键字即可,而要二进制序列化的属性的类型必须是可序列化的数据

ASP输出JSON数据及客户端jQuery处理方法

首先ASP处理JSON需要json官方提供的JSON For ASP 封装类文件,下载地址:http://code.google.com/p/aspjson/downloads/list 下载最新的JSON_2.0.4.asp文件备用. 1.ASP简单JSON对像及数组输出 Demo1.asp <%@LANGUAGE=”VBSCRIPT” CODEPAGE=”65001″%><% Response.Charset = “UTF-8″ %><% Response.Content

Go(day7 [终端读写| 文件操作 | 命令行参数 | Json序列化])

终端读写 操作终端相关文件句柄常量 os.Stdin:标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出 终端读写示例: //Sscanf 是从变量中读取值 package main import "fmt" var ( firstName,lastName ,s string i int f float32 input = "56.12 / 5212 / Go" format  = "%f/%d/%s" ) func ma

python基础5—文件 | json序列化

下面这些代码没有经过试验, 只是作为代码段作为日后的参考, 这些死的api姑且放在这里用的时候看一下再做总结 import sys print(sys.path) # ---------------文件---------------------------- # 第一种直接方式 file1 = open("test.txt") file2 = open("output.txt", "w") # w 表示 write (覆写) r 表示 read

Jquery解析json字符串、json数组

<!doctype html> <html> <head> <meta charset="utf-8"> <script src="../js/libs/jquery-1.6.2.min.js"></script> </head> <body> <hr /> <h3>解析json字符串.json数组</h3> <input typ