C#处理JSON类型数据序列化和反序列化的一点心得体会
在处理JSON类型的数据时,定义了很多JSON类型。经常需要用到序列化和反序列化。刚开始接触到这个问题时,我给每个JSON类型都增加了类似下方的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; namespace 企业微信账号
{
[DataContract]
public class JToken
{
[DataMember] public string userid { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public List<long> department { get; set; }
public override string ToString()
{
var serializer = new DataContractJsonSerializer(this.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, this);
var b = ms.ToArray();
var s = Encoding.UTF8.GetString(b);
return s;
}
}
public static JToken FromString(string s)
{
var serializer = new DataContractJsonSerializer(typeof(JToken));
var b = Encoding.UTF8.GetBytes(s);
using (var ms = new MemoryStream(b))
{
var o = (JToken)serializer.ReadObject(ms);
return o;
}
}
}
}
使用上面的代码JSON类型对象的序列化和反序列化问题。随着项目的进展,定义了越来越多的JSON类型,每次定义完字段后都要把这两个方法复制进去,再稍作调整。随着JSON类型数量的增加,感觉再使用这种方式,效率太低了,考虑改用其他方式。后来增加了JSON类型的操作类JsonConverter。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; namespace 企业微信账号
{
public class Program
{
public static void Test()
{
var strToken = "{\"userid\":\"admin\",\"name\":\"系统管理员\",\"department\":[1]}";
var token = JsonConverter.FromString<JToken>(strToken);
}
}
[DataContract]
public class JToken
{
[DataMember] public string userid { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public List<long> department { get; set; }
} public static class JsonConverter
{
public static string ToString(object o)
{
var serializer = new DataContractJsonSerializer(o.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, o);
var b = ms.ToArray();
var s = Encoding.UTF8.GetString(b);
return s;
}
}
public static T FromString<T>(string s)
{
var serializer = new DataContractJsonSerializer(typeof(T));
var b = Encoding.UTF8.GetBytes(s);
using (var ms = new MemoryStream(b))
{
var o = (T)serializer.ReadObject(ms);
return o;
}
} }
}
用得时间长了,还是觉得代码不美观。例如:var token = JsonConverter.FromString<JToken>(strToken),在调用的时候还需要在调用函数上指定结果类型<JToken>。于是开始在网上找资料,看看能不能再继续进行优化。最初的目的是想在父类中写静态方法,用子类去继承静态方法。后来发现在子类虽然能继承到方法,但是根本拿不到子类的类型。
后来查到可以将父类定义成一个泛型的类,这样在定义子类时,可以在写继承时通过下面的形式将子类的类型传进父类的静态方法中
class A<T>
{
public static T func(string s)
{ }
}
class A1 : A<A1>
{ }
最后,将所有的JSON类型都增加了一个继承的父类JObject。在JObject类中实现序列化和反序列化,然后每个JSON类都继承JObject类,这样每个类只要继承JObject类就可以了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; namespace 企业微信账号
{
public class Program
{
public static void Test()
{
var token = new JToken() { name = "系统管理员", userid = "admin", department = new List<long>() { 1 } };
var s = token.ToString();
var obj = JToken.FromString(s);
}
}
[DataContract]
public class JToken : JObject<JToken>
{
[DataMember] public string userid { get; set; }
[DataMember] public string name { get; set; }
[DataMember] public List<long> department { get; set; }
} [DataContract]
public class JObject<T>
{
public override string ToString()
{
var serializer = new DataContractJsonSerializer(this.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, this);
var b = ms.ToArray();
var s = Encoding.UTF8.GetString(b);
return s;
}
} public static T FromString(string s)
{
var serializer = new DataContractJsonSerializer(typeof(T));
var b = Encoding.UTF8.GetBytes(s);
using (var ms = new MemoryStream(b))
{
var o = (T)serializer.ReadObject(ms);
return o;
}
}
}
}
C#处理JSON类型数据序列化和反序列化的一点心得体会的更多相关文章
- .net core Json字符串的序列化和反序列化通用类源码,并模拟了10万数据对比DataContractJsonSerializer和Newtonsoft性能
我们在开发中Json传输数据日益普遍,有很多关于Json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效.因为有太多选择,人们往往会陷入选择难题. 相比.NET Fram ...
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...
- 【转】在C#中使用Json.Net进行序列化和反序列化及定制化
作者:Minotauros 原文地址:在C#中使用Json.Net进行序列化和反序列化及定制化 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态, ...
- XPatchLib 对象增量数据序列化及反序列化器 For .Net
在日常的软件开发和使用过程中,我们发现同一套系统的同一配置项在不同的客户环境中是存在各种各样的差异的.在差异较为分散时,如何较好的管理这些差异,使得维护过程能够更加安全和快速,一直在这样那样的困扰着开 ...
- C#操作json类型数据
将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象. 此类不能继承. // msdn 例子: namespace SL_DataContractJson ...
- MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错
MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...
- Python数据结构同Json类型数据相互转换的用法
在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...
- 迭代器/生成器/装饰器 /Json & pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- Struts2+Jquery实现ajax并返回json类型数据
来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...
随机推荐
- vscode 部分替换(正则替换)
1. 数字 \d{n} 2. 数字和字母 [A-Za-z0-9]{n} 常用运算符与表达式 ^ 开始 () 域段 [] 包含,默认是一个字符长度 [^] 不包含,默认是一个字符长度 {n,m} 匹配长 ...
- 大二下学期开学java测试
我们在2月13日下午进行了java测试(是一个新闻类型的题),通过这一个测试我进行了以下总结: 我对于javaweb的框架构建和加密密码,还有一些不同人物功能的实现,使得我在这次得考试中成绩不太理想. ...
- PostProcess
后处理器: AutowiredAnnotationBeanPostProcess.class 可以处理@Autowired.@Value 如何注册:context.registerBean(xxx.c ...
- 寻找进程ID
- NX环境变量设置脚本
1 @ECHO OFF 2 TITLE NX 环境变量设置 3 color 3f 4 :MENU 5 CLS 6 ECHO. NX环境变量设置工具 7 ECHO.******************* ...
- HCIA-ICT实战基础11-网络地址转换NAT&NAPT
HCIA-ICT实战基础-网络地址转换 目录 NAT概述 静态NAT 动态NAT NAPT.Easy-IP NAT Server 扩展 NAT ALG 扩展 双向NAT 扩展 重叠NAT转换方式 1 ...
- SQL-建表注释
ddl 是对表结构的操作 create(创建)命令.alter(修改)命令.drop(删除)dml 是对表数据的操作 insert(插入)命令.update(更新)命令.delete(删除) alte ...
- 高性能的StampedLock锁
StampedLock 支持的三种锁模式: 1.ReadWriteLock 支持两种模式:一种是读锁,一种是写锁 2.StampedLock 支持三种模式,分别是:写锁.悲观读锁和乐观读 1)写锁.悲 ...
- IE8兼容的零零碎碎
css部分 1 nth-of-type选择器 2 span:nth-of-type(1) 3 /*IE8兼容写法*/ 4 span:first-child /*选中第一个*/ 5 span:first ...
- Java Collection体系
Collection 接口 宏观图 快速使用 import java.util.*; public class Demo { public static void main(String[] args ...