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

news2024/11/16 19:30:50

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;
#endif
        string[] 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.coloradmin.cn/o/1246406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云发布新一代基于AMD处理器的星星海云服务器实例SA5

基础设施的硬实力&#xff0c;愈发成为云厂商的核心竞争力。 11月24日&#xff0c;腾讯云发布了全新一代星星海服务器。基于自研服务器的高密设计与硬件升级&#xff0c;对应云服务器SA5是全球首家搭载第四代AMD EPYC处理器&#xff08;Bergamo&#xff09;的公有云实例&#…

通过内网穿透本地MariaDB数据库,实现在公网环境下使用navicat图形化工具

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

麒麟KYSEC使用方法05-命令设置密码强度

原文链接&#xff1a;麒麟KYSEC使用方法05-命令设置密码强度 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第五篇内容----使用命令设置密码强度&#xff0c;密码强度策略有两个文件需要修改&#xff0c;pwquality.conf/login.defs&…

利用mvnrepository找到jssc(或其他特定包)的jar包下载本地并导入JAVA项目

文章目录 一、mvnrepository下载jar包&#xff08;找到依赖&#xff09;第一步&#xff1a;进入mvnrepository第二步&#xff1a;搜索名称第三步&#xff1a;进入详情第四步&#xff1a;选择版本第五步&#xff1a;点击下载 二、jar包添加到项目操作流程成功标志 一、mvnreposi…

小学生古诗文大会复赛在线模拟新增刷题版和闯关版,帮助孩子冲刺

小学生古诗文大会明天就要开始了&#xff0c;刚刚古诗文大会主办方也正式发布了通知&#xff0c;总体安排、操作指引和我之前发布的一样&#xff1a;2023年11月25日小学生古诗文大会复选&#xff08;复赛&#xff09;答题操作手册 为了帮助参加复选&#xff08;复赛&#xff09…

Spring事务的实现方式和实现原理;事务声明的方式,Spring的事务传播行为,spring事务的实现原理

Spring事务的实现方式和实现原理 Spring事务的本质其实就是数据库对事务的支持&#xff0c;没有数据库的事务支持&#xff0c;spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 什么是事务 数据库事务是指作为单个逻辑工作单元执…

Tomcat注册为服务后,如何配置Tomcat内存大小

前提条件&#xff1a;tomcat已经注册为服务。 1.winR,输入regedit打开注册表 2.找到Tomcat注册表路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat80603.找到jvm内存配置路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTW…

骨传导耳机的优缺点都有哪些?骨传导耳机值得入手吗?

骨传导耳机的优点还是很多的&#xff0c;相比于传统耳机&#xff0c;骨传导耳机要更值得入手&#xff01; 下面让我们了解下骨传导耳机的优缺点都有哪些&#xff1a; 一、优点 1、使用更安全 传统的耳机&#xff0c;在使用时会听不到外界的声音&#xff0c;而骨传导耳机通过…

【SpringCloud】微服务架构设计模式

一、聚合气微服务设计模式 最常见、最简单的设计模式&#xff0c;效果如图所示&#xff1a; 聚合器调用多个服务实现应用程序所需的功能 它可以是一个简单的 Web 页面&#xff0c;将检索到的数据进行处理并展示&#xff0c;也可以是一个更高层次的组合微服务&#xff0c;对…

快手ConnectionError

因为运行的程序被中断导致 top然后查看站用处内存高的accelerate kill进程号 9回车

NFC技术简介

NFC简介 NFC(近场通信&#xff0c;Near Field Communication&#xff09;是一种短距高频的无线电技术&#xff0c;由非接触式射频识别(RFID)演变而来。 NFC工作频率为13.56Hz&#xff0c;通常只有在距离不超过4厘米时才能启动连接&#xff0c;其传输速度有106 Kbit/秒、212 Kb…

IBM V5000存储报错控制器脱机节点自动恢复失败

PS&#xff1a;友情分享&#xff0c;请注意报错信息是否与本文一致。设备有价&#xff0c;数据无价&#xff0c;谨慎操作&#xff01; 报错信息&#xff1a; 存储为双控制器互相冗余&#xff0c;目前node2脱机&#xff0c;node1已承载所有业务 处理方案&#xff1a; 登录进n…

SpringBoot+SSM项目实战 苍穹外卖(1)

目录 产品原型与技术选型后端环境搭建Git版本控制IDEA中运行sql脚本文件nginx反向代理和负载均衡完善登录功能 导入接口文档SwaggerSwagger常用注解 产品原型与技术选型 管理端原型图&#xff1a; 用户端原型图&#xff1a; 餐饮企业内部员工使用。 主要功能有: 模块描述登录…

onelist能让alist聚合网盘拥有海报墙

什么是 onelist &#xff1f; onelist 是一个类似 emby 的专注于刮削 alist 聚合网盘形成影视媒体库的程序。 主要解决以下痛点&#xff1a; alist 挂载云盘后能在网页端看视频&#xff0c;却没有分类&#xff0c;没有海报墙&#xff1b;使用 webdav 挂载本地后&#xff0c;用…

马斯克星链与芯事:30亿美元炸出卫星互联网革命,GPU算力创无限可能

★卫星互联网&#xff1b;算力&#xff1b;卫星通信&#xff1b;互联网&#xff1b;低轨卫星互联网&#xff1b;5G基础设施&#xff1b;GPT-4 Turbo&#xff1b;算力&#xff1b;地面通信&#xff1b;液冷&#xff1b;水冷&#xff1b;AI服务器&#xff1b;东数西算&#xff1b…

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(免费思路)

中国是世界上最大的苹果生产国&#xff0c;年产量约为 3500 万吨。同时&#xff0c;中国也是世界上最大的苹果出口国&#xff0c;世界上每两个苹果中就有一个出口到国。世界上每两个苹果中就有一个来自中国&#xff0c;中国出口的苹果占全球出口量的六分之一以上。来自中国。中…

【数据结构】最小生成树(Kruskal算法)

一.基本思想 设无向连通网为G&#xff08;V&#xff0c;E&#xff09;&#xff0c;令G的最小生成树为T&#xff08;U&#xff0c;TE&#xff09;&#xff0c;其初态为UV&#xff0c;TE{},然后&#xff0c;按照边的权值由小到大的顺序&#xff0c;考察G的边集E中的各条边。若被考…

简述马尔可夫链【通俗易懂】

前言 马尔可夫链&#xff08;Markov Chain&#xff09;可以说是机器学习和人工智能的基石&#xff0c;在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用。 The future is independent of the past given the present 未来独立于过去&#xff…

不小心删除了Mac重要文档?试试这10个Mac数据恢复软件

您是否不小心删除了重要文件并需要可靠的解决方案&#xff1f;别再犹豫了&#xff01;本文是您选择最佳 Mac 数据恢复软件的首选指南。我们的目标是为您提供做出明智决策和轻松找回丢失数据所需的工具和知识。 选择最佳 Mac 数据恢复软件&#xff1a;要考虑的因素 选择最佳 Ma…

高精度人像背景分割SDK技术解决方案

图像处理技术已经成为企业和个人生活中不可或缺的一部分&#xff0c;特别是在人像处理方面&#xff0c;如何准确、高效地将人物与背景分离&#xff0c;一直是一个技术难题。然而&#xff0c;美摄科技凭借其在AI深度学习领域的深厚积累&#xff0c;推出了一款高精度的人像背景分…