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中查询出需要返回的 ...
随机推荐
- 自我察觉 vs 自我意识
自我察觉,知道并理解自己的意图,能够知晓自己干什么 自我意识,评估并修正自己的意图,能够自主选择干什么
- stream-分组两次
Map<String, Map<String, List<AmazonBalanceCustom>>> amazonBalanceMap = amazonBalan ...
- 关于 verilator 中 config.vlt 等配置文件的使用
参考网页:https://verilator.org/guide/latest/exe_verilator.html#configuration-files 注意,在使用 config.vlt 配置文 ...
- Pr视频软件主要知识点
1,选中某一个面板,点击"Tab键上的 '波浪号' 键"即可将这个面板全屏展示 . 2,新建序列项目:自定义,25帧/s,方形像素,无场(逐行扫描). 3,序列面板素材自动缩放适 ...
- drf从入门到飞升仙界 02
restful规范 # restful是一种定义web API接口的设计风格,适用于前后端分离的应用模式中 # 关于restful的10个规范 -1.数据的安全保障,通常使用https协议(http+ ...
- python利用xlwings写入一行或一列Excel数据
注意点:这里的sheet参数默认是已经存在的sheet表,如不存在该sheet,则使用add方法新增即可,示例: wb = xw.Book(r"C:\Users\Desktop\result ...
- spreadJs导入、Java保存到数据库
下载并引用spreadJs 定义全局变量,初始化表格控件 var $this = this;this.spread_obj; $this.spread_obj = new GC.Spread.Shee ...
- ios唤起键盘后,页面不收回导致元素错位的问题.(譬如固定在底部的自定义键盘等)
解决办法 var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 // ...
- 学习lua-04,json.util merge方法对集合处理的实际应用,及tostring方法
local jsonutil = require("json.util") local merge = require("json.util").merge l ...
- 华为光猫HG8346V5配置