C#,轻量化Json序列化、反序列化及自动格式化的组件SimpleJson源代码与使用实例(可放弃Newtonsoft.Json了)

1 JSON 的用法

C#中常用 json 保存与分享数据。其中的过程主要是:

(1)程序内的 Class 或 List 或 Hashtable ... -> 序列化为 json 文件或 stream;

(2)加密、传送、接收、解密、(保存 或 不保存)等;

(3)json 反序列化为 Class 或 List 或 Hashtable 等等,用于程序的计算;

2 JSON 序列化 与 反序列化

大家一般都使用 Newtonsoft.Json 进行 json 的序列化与反序列化。

使用 nuget 即可方便使用。

序列化就是将类(内存中定义的一种数据类型):

class mate
{public int Id { get; set; } = -1;public string Name { get; set; } = "";public mate(int id, string name) { Id = id; Name = name; }
}

比如:其中的实例(内存中的数据):

mate one = new mate(110101, "haha");

序列化 后 变成 :

{ "Id" : 110101, "Name" : "haha" }

这样的明文。当然,如果数据多的化,非常不清晰,因而需要一个 格式化 的过程。

变成:

{"Id" : 110101,"Name" : "haha"
}

总结一下:json序列化就是将内存中的(一类)数据转换为标准化的、格式化的明文。反序列化就是将明文转为内存中的(一类)数据。

Newtonsoft.Json 的序列化如下:

mate one = new mate(110101, "haha");
string single = Newtonsoft.Json.JsonConvert.SerializeObject(one);List<mate> two = new  List<mate>();
two.Add(new mate(110101, "baba"));
two.Add(new mate(110102, "mama"));
string family = Newtonsoft.Json.JsonConvert.SerializeObject(two);

Newtonsoft.Json 的反序列化则是:

mate oneFF = Newtonsoft.Json.JsonConvert.DeserializeObject<mate>(single);
List<mate> twoFF = Newtonsoft.Json.JsonConvert.DeserializeObject<List<mate>>(family);

3 Newtonsoft.Json 的小问题

Newtonsoft 的 json 组件在效率、可靠性等方面都无与伦比。

但也稍微有点问题:

(1)发布软件必须多带一个 Newtonsoft.Json.dll;不符合纯绿色软件的要求;

(2)不能自动格式化;或者需要另外加一个格式化代码;

4 无需 DLL 的轻量化json序列化与反序列化

一般的小工具,俺都喜欢写成纯绿色代码。

所以一直在使用自己的 json 序列化与反序列化组件,先开放出来共享。

没有DLL;自动格式化;可靠性与效率都OK。

4.1 轻量化json序列化与反序列化的源代码

using System;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;/// <summary>
/// System.Runtime.Serialization.Json扩展方法类
/// ([DataContract]和[DataMember]联合使用来标记被序列化的字段)
/// </summary>
public static class SimpleJson
{/// <summary>/// 数据格式化的字典/// </summary>private static Dictionary<Type, DataContractJsonSerializer> dic { get; set; } = new Dictionary<Type, DataContractJsonSerializer>();/// <summary>/// TAB对应的空格数/// </summary>private static string TabString { get; set; } = "    ";/// <summary>/// 检索合适的数据格式化的字典/// </summary>/// <param name="type"></param>/// <returns></returns>private static DataContractJsonSerializer GetSerializer(Type type){if (!dic.ContainsKey(type)){dic.Add(type, new DataContractJsonSerializer(type));}return dic[type];}/// <summary>/// 将Json字符串反序列化为对象实例/// System.Runtime.Serialization.Json/// ([DataContract]和[DataMember]联合使用来标记被序列化的字段)/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="jsonString">Json字符串</param>/// <returns>对象实例</returns>public static T DeserializeObject<T>(string jsonString){DataContractJsonSerializer ser = GetSerializer(typeof(T));using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))){T jsonObject = (T)ser.ReadObject(ms);return jsonObject;}}/// <summary>/// 将对象实例序列化为Json字符串/// System.Runtime.Serialization.Json/// ([DataContract]和[DataMember]联合使用来标记被序列化的字段)/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="obj">对象实例</param>/// <returns>Json字符串</returns>public static string SerializeObject<T>(T obj){DataContractJsonSerializer ser = GetSerializer(typeof(T));using (MemoryStream ms = new MemoryStream()){ser.WriteObject(ms, obj);ms.Position = 0;using (StreamReader sr = new StreamReader(ms, Encoding.UTF8)){return JsonFormat(sr.ReadToEnd());}}}/// <summary>/// JSON字符串格式化/// </summary>/// <param name="json"></param>/// <returns></returns>public static string JsonFormat(string json){int level = 0;int bracket = 0;StringBuilder sb = new StringBuilder();for (int i = 0; i < json.Length; i++){string c = json.Substring(i, 1);if (level > 0){string tail = sb.ToString();tail = tail.Substring(tail.Length - 1);if (tail == "\n"){sb.Append(LevelSpace(level));}}if (c == "\""){if ((bracket % 2) == 0){sb.Append(c);bracket++;continue;}else{if (json.Substring(i - 1, 1) == "\\"){sb.Append(c);continue;}else{sb.Append(c);bracket--;continue;}}}if ((bracket % 2) == 1){sb.Append(c);continue;}switch (c){case "{":case "[":sb.AppendLine(c);level++;break;case ":":sb.Append(c + " ");break;case ",":sb.AppendLine(c);break;case "}":case "]":sb.AppendLine("");level--;sb.Append(LevelSpace(level) + c);break;default:sb.Append(c);break;}}return sb.ToString();}/// <summary>/// 按数据层次计算前端空格数(4=TAB)/// </summary>/// <param name="level"></param>/// <returns></returns>private static string LevelSpace(int level){
#if __ORIGINAL__string leaf = string.Empty;for (int t = 0; t < level; t++){leaf += TabString;}return leaf;
#endifstring[] sa = new string[level];for (int i = 0; i < sa.Length; i++) sa[i] = TabString;return String.Join("", sa);}
}

4.2 使用轻量化json序列化与反序列化

将上述代码保存为 SimpleJson.cs 文件,将该文件添加之项目。

其他就很简单了。

4.3 轻量化json序列化

// 将 cx 这个类的实例序列化为 json 字符串(自动格式化哦!)
string json = SimpleJson.SerializeObject(cx);
// 保存到文本文件;
File.WriteAllText(filename, json, Encoding.UTF8);

4.4 轻量化json反序列化的代码

// 文本文件读取配置信息 json
string json = File.ReadAllText(filename, Encoding.UTF8);
// 将json反序列化为 ConfigInfo 类的实例 cy
ConfigInfo cy = SimpleJson.DeserializeObject<ConfigInfo>(json);

4.5 可能遇到的问题

可能在这句上出现错误: 

using System.Runtime.Serialization.Json;

解决之道:

需要添加 System.Runtime.Serialization 组件。

这个不会需要附加 DLL 文件哦。

没有违反纯绿色软件之约。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/213940.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot3+vue3从0到1开发实战项目(一)

一. 可以在本项目里面自由发挥拓展 二. 知识整合项目使用到的技术 后端开发 &#xff1a; Validation, Mybatis,Redis, Junit,SpringBoot3 &#xff0c;mysql&#xff0c;Swagger, JDK17 &#xff0c;项目部署 前端开发&#xff1a; Vue3&#xff0c;Vite&#xff0c;Router…

清华大学提出全新加速训练大模型方法SoT

近日&#xff0c;微软研究和清华大学的研究人员共同提出了一种名为“Skeleton-of-Thought&#xff08;SoT&#xff09;”的全新人工智能方法&#xff0c;旨在解决大型语言模型(LLMs)生成速度较慢的问题。 尽管像GPT-4和LLaMA等LLMs在技术领域产生了深远影响&#xff0c;但其处…

现在可以手动获取真随机数吗?

获取真正的随机数并不像获取伪随机数那样简单&#xff0c;因为真随机数的产生依赖于物理过程或者其他难以预测的现象。在计算机科学中&#xff0c;通常使用的是伪随机数&#xff0c;它们是通过算法生成的&#xff0c;看起来像是随机的&#xff0c;但实际上是可以重现的。 如果…

什么是高防CDN?CDN的设计原理及应用场景是什么?

随着互联网的快速发展&#xff0c;人们对网络的速度和稳定性要求也越来越高。CDN技术作为网络优化的重要手段&#xff0c;被越来越多的企业和网站所采用。现在我为大家介绍一下CDN的设计原理以及应用场景。 一.高防CDN技术概述 高防CDN是一种应用了高级防御技术的内容分发网络…

MySQL-进阶

存储引擎 MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和连接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a; 第二层架构主要完成大多数的核心服务功能&…

【ARM CoreLink 系列 3.2 -- CCI-400,CCI-500, CCI-550 差异】

文章目录 CCI-400 和 CCI-500 差异ARM CCI-400ARM CCI-500ARM CCI-550CCI-400 和 CCI-500 差异 ARM的 CCI(Cache Coherent Interconnect)系列产品是用于多核处理器之间的高性能缓存一致性互连。CCI-400 和 CCI-500 是该系列中的两种设计,它们旨在允许多个处理器核心和其他资…

在Linux服务器部署爬虫程序?大佬只需七步!

之前在某乎上看见一篇关于《为什么很多程序员都建议使用 Linux》的文章&#xff0c;结合我自身关于Linux的使用经验。心血来潮得写了一段关于我在Linux系统部署爬虫程序的心得&#xff0c;希望结识更多的爬虫技术大佬&#xff0c;一起游弋在代码世界中。 根据我多年在Linux上部…

NPU、CPU、GPU算力及算力计算方式

NVIDIA在9月20日发布的NVIDIA DRIVE Thor 新一代集中式车载计算平台&#xff0c;可在单个安全、可靠的系统上运行高级驾驶员辅助应用和车载信息娱乐应用。提供 2000 万亿次浮点运算性能&#xff08;2000 万亿次8位浮点运算&#xff09;。NVIDIA当代产品是Orin&#xff0c;算力是…

使用骨传导耳机会伤耳朵吗?一文读懂骨传导耳机有哪些优点

首先说明&#xff0c;如果是正确的使用骨传导耳机是不会伤耳朵。 一、骨传导耳机的传声原理是什么&#xff1f; 声音的传播需要介质&#xff0c;传统的耳机是通过空气来进行传播&#xff0c;也被称为“空气传导耳机”&#xff0c;而骨传导耳机最大的特别之处就在于&#xff0…

基本微信小程序的图书馆座位管理系统

项目介绍 图书馆因有良好的学习氛围、大量的学习资源吸引大家前来学习,图书馆还未开馆就有大量的用户在门口排队等待,有限的座位与日益增加的自主学习者之间形成了供不应求的现象,再加上不了解图书馆的座位使用情况和恶意占座等现象,使得有限的学习座位越发紧张。本团队针对此…

【第一部分:概述】ARM Realm Management Monitor specification

目录 概述机密计算系统软件组成MonitorRealmRealm Management Monitor (RMM)Virtual Machine (VM)HypervisorSecure Partition Manager (SPM)Trusted OS (TOS)Trusted Application (TA) Realm Management Monitor 参考文献 概述 RMM是一个软件组件&#xff0c;它构成了实现ARM…

Peter算法小课堂—前缀和数组的应用

桶 相当于计数排序&#xff0c;看一个视频 桶排序 太戈编程1620题 算法解析 #include <bits/stdc.h> using namespace std; const int R11; int cnt[R];//cnt[t]代表第t天新增几人 int s[R];//s[]数组是cnt[]数组的前缀和数组 int n,t; int main(){cin>>n;for(…