在处理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类型数据序列化和反序列化的一点心得体会的更多相关文章

  1. .net core Json字符串的序列化和反序列化通用类源码,并模拟了10万数据对比DataContractJsonSerializer和Newtonsoft性能

    我们在开发中Json传输数据日益普遍,有很多关于Json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效.因为有太多选择,人们往往会陷入选择难题. 相比.NET Fram ...

  2. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  3. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  4. 【转】在C#中使用Json.Net进行序列化和反序列化及定制化

    作者:Minotauros 原文地址:在C#中使用Json.Net进行序列化和反序列化及定制化 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态, ...

  5. XPatchLib 对象增量数据序列化及反序列化器 For .Net

    在日常的软件开发和使用过程中,我们发现同一套系统的同一配置项在不同的客户环境中是存在各种各样的差异的.在差异较为分散时,如何较好的管理这些差异,使得维护过程能够更加安全和快速,一直在这样那样的困扰着开 ...

  6. C#操作json类型数据

    将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象. 此类不能继承. // msdn 例子: namespace SL_DataContractJson ...

  7. MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错

    MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...

  8. Python数据结构同Json类型数据相互转换的用法

    在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...

  9. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  10. Struts2+Jquery实现ajax并返回json类型数据

    来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...

随机推荐

  1. Vue非父子組件(爺孫關係)通信Provide&&Inject

    通常,当我们需要从父组件向子组件传递数据时,我们使用 props.想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容.在这种情况下,如果仍然将 prop 沿着组件链逐级传递 ...

  2. ionic 架构

    1.路由:rout,页面内容:html,页面css:scss,js脚本内容:ts 2.功能介绍 路由:负责组织每个页面. 页面css:scss,负责定制每个组件的内容,比如组件是iobag,那么在这个 ...

  3. Could not resolve dependency:peer swiper@“^5.2.0“ from vue-awesome-swiper@4.1.1

    在安装vue-awesome-swiper时报错: Could not resolve dependency:peer swiper@"^5.2.0" from vue-aweso ...

  4. 供配电一次测 PT柜 解释

    文章来源: PT柜_百度百科 (baidu.com)  视频介绍 很多电工不清楚的高压PT柜,老电工带你了解工作原理和作用_搜狐汽车_搜狐网 (sohu.com) 很多电工怕PT柜,今天电气成套设计实 ...

  5. 手写简单call、apply、bind

    1.call ~function(){ function call_1(context, ...args){ context = context == undefined ? window : con ...

  6. npm设置和取消代理的方法

    设置代理 npm config set proxy=http://server:port npm config set https-proxy https://server:port // https ...

  7. Dockerfile 参考

    Dockerfile:FROM openjdk:8u252-jdkENV JHIPSTER_SLEEP=0 \ JAVA_OPTS="" \ LOGFILE="" ...

  8. vue中key

    使用key维护列表的状态 当列表的数据变化时,默认情况下,vue尽可能的服用已存在的DOM元素,从而提升渲染的性能.但这种默认的性能优化策略,会导致由状态的列表无法被正确更新. key的使用注意事项: ...

  9. TypeScript - 配置文件 tsconfig.json

    tsconfig.json 文件 创建两种方式: 1. 直接在根目录新建tsconfig.config.json (配置文件需要自己配置) 2. 执行tsc --init  (会自动创建相关配置) t ...

  10. 058_Component Bundles