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中查询出需要返回的 ...
随机推荐
- spring Security 使用
1.pom文件引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- Qt6以上安装速度慢解决-国内镜像加速
1.安装抓包软件Fiddler最新版本 Fiddler30天试用 2.在软件下方输入栏内粘贴以下命令 urlreplace download.qt.io mirrors.tuna.tsinghua.e ...
- git拉取本地或者分支
拉取本地 git clone 拉取的仓库地址 新建一个文件夹,然后右键 拉取分支到本地 也是新建一个文件夹右键点击 Git Bash Here 然后输入 git clone -b 分支名称 分支地址 ...
- 解决The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
问题 yang@k8s-master:/etc/apt/sources.list.d$ sudo apt update Get:1 https://mirrors.aliyun.com/kuberne ...
- Linux 系统挂载 ntfs 移动硬盘无法写入的问题
linux 下挂载 ntfs 移动硬盘无法写入问题 在机房使用移动硬盘时发现无法写入硬盘,具体是 Ubuntu 21.04 ,移动硬盘是 SSD ,分区类型是 NTFS . 首先百度得知最优办法是安装 ...
- vue v-model的原理
关于v-model v-model 可以实现表单与data里的双向绑定 很多插件上可以在组件上使用v-model,他是如何实现的呢,其实v-model就是一个语法糖 <input v-model ...
- js检测邮箱格式,正则检测邮箱格式
网上搜了关于邮箱格式的检测,发现很多不太适用,我自己写了一个,可以检测有开头和没开头的,又可以检测@,@qq. 后的格式 var myReg=/^(\w|(\.\w+))+@([a-zA-Z0-9_- ...
- anaconda怎么将用户名路径切换为工作路径
- 使用DockerCompose部署微服务项目(基于Springboot搭建一个简易计数器)
准备Dockerfile FROM java:8 #基于jdk8的环境 COPY *.jar /app.jar #拷贝所有的jar包到/app.jar目录下 CMD ["--server.p ...
- Phpstorm 最新永久激活教程
使用ja-netfilter激活Jetbrains系列软件 注意:无限试用脚本已经失效.本教程适合2021.3.*之上的高版本,使用ja-netfilter插件进行激活操作,永久有效 激活步骤: 第一 ...