C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库。下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比:

在 Swifter.Json 近期更新的 API 中增加了直接构建 JSON 和直接解析 JSON 的方法。下面演示这两个方法如何使用:
1:使用 JsonWriter 直接生成 Json 文档:
using Swifter.Json;
using Swifter.Tools;
using System; public class Demo
{
public static void Main()
{
var jsonWriter = JsonFormatter.CreateJsonWriter(); jsonWriter.WriteBeginObject(); jsonWriter.WritePropertyName("Id");
jsonWriter.WriteInt32(); jsonWriter.WritePropertyName("Name");
jsonWriter.WriteString("Dogwei"); jsonWriter.WriteEndObject(); Console.WriteLine(jsonWriter.HGCache.ToStringEx()); /**
* Output : {"Id":123,"Name":"Dogwei"}
*/
}
}
注意:使用 JsonWriter 时应将 jsonWriter 保存起来,重复使用,这样才能将性能最大化。
2:使用 JsonReader 直接遍历 Json 文档:
using Swifter.Json;
using System;
using System.IO; public class Demo
{
public static void Main()
{
using var textReader = new StringReader("{\"Id\":123,\"Name\":\"Dogwei\"}"); var jsonReader = JsonFormatter.CreateJsonReader(textReader); if (jsonReader.TryReadBeginObject())
{
while (!jsonReader.TryReadEndObject())
{
var name = jsonReader.ReadPropertyName(); switch (name)
{
case "Id":
Console.WriteLine($"{name}: {jsonReader.ReadInt32()}");
break;
case "Name":
Console.WriteLine($"{name}: {jsonReader.ReadString()}");
break;
default:
Console.WriteLine($"{name}: {jsonReader.DirectRead()}");
break;
}
}
} /**
* Output :
* Id: 123
* Name: Dogwei
*/
}
}
3:更简单的遍历 Json 文档:
using Swifter.Json;
using System;
using System.IO; public class Demo
{
public static void Main()
{
using var textReader = new StringReader("[{\"Id\":1,\"Name\":\"Dogwei\"},{\"Id\":2,\"Name\":\"ChenXinwei\"},{\"Id\":3,\"Name\":\"Swifter.Json\"}]"); var jsonReader = JsonFormatter.CreateJsonReader(textReader); foreach (var item in jsonReader.ReadArray())
{
foreach (var pair in item.ReadObject())
{
var name = pair.Key;
var value = pair.Value.DirectRead(); Console.WriteLine($"{name} : {value}");
}
} /**
* Output :
* Id : 1
* Name : Dogwei
* Id : 2
* Name : ChenXinwei
* Id : 3
* Name : Swifter.Json
*/
}
}
注意:JsonReader 是原始提供的是原始解析 Json 的方法,它性能极快,也正因此,它每个读取方法都会偏移游标,不读取就不偏移,解析 Json 时所有的 '值' 都必须读且只读一次!如上例:如果 pair.Value.DirectRead() 调用了两次,或者一次都没调用,那么就会解析出错!
下例做一下简单的性能对比:
using Newtonsoft.Json;
using Swifter.Json;
using System;
using System.Diagnostics;
using System.IO; public class Demo
{
public static void Main()
{
var swifterWriter = JsonFormatter.CreateJsonWriter(); var newtonsoftStringWriter = new StringWriter();
var newtonsoftWriter = new JsonTextWriter(newtonsoftStringWriter); while (true)
{
var stopwatch = Stopwatch.StartNew(); for (int i = ; i < ; i++)
{
newtonsoftWriter.WriteStartObject(); newtonsoftWriter.WritePropertyName("Id");
newtonsoftWriter.WriteValue(); newtonsoftWriter.WritePropertyName("Name");
newtonsoftWriter.WriteValue("Dogwei"); newtonsoftWriter.WriteEndObject(); newtonsoftStringWriter.GetStringBuilder().Length = ;
} Console.WriteLine($"Newtonsoft.Json : {stopwatch.ElapsedMilliseconds}"); stopwatch = Stopwatch.StartNew(); for (int i = ; i < ; i++)
{
swifterWriter.WriteBeginObject(); swifterWriter.WritePropertyName("Id");
swifterWriter.WriteInt32(); swifterWriter.WritePropertyName("Name");
swifterWriter.WriteString("Dogwei"); swifterWriter.WriteEndObject(); swifterWriter.Clear();
} Console.WriteLine($"Swifter.Json : {stopwatch.ElapsedMilliseconds}"); Console.ReadKey();
} /**
* Output:
* Newtonsoft.Json : 197
* Swifter.Json : 64
*/
}
}
using Newtonsoft.Json;
using Swifter.Json;
using System;
using System.Diagnostics;
using System.IO; public class Demo
{
public static void Main()
{
while (true)
{
var stopwatch = Stopwatch.StartNew(); for (int i = ; i < ; i++)
{
var jsonReader = new JsonTextReader(new StringReader("{\"Id\":123,\"Name\":\"Dogwei\"}")); while (jsonReader.Read())
{
if (jsonReader.TokenType == JsonToken.PropertyName)
{
var name = (string)jsonReader.Value; switch (name)
{
case "Id":
jsonReader.ReadAsInt32();
break;
case "Name":
jsonReader.ReadAsString();
break;
default:
jsonReader.Skip();
break;
}
}
}
} Console.WriteLine($"Newtonsoft.Json : {stopwatch.ElapsedMilliseconds}"); stopwatch = Stopwatch.StartNew(); for (int i = ; i < ; i++)
{
var jsonReader = JsonFormatter.CreateJsonReader(new StringReader("{\"Id\":123,\"Name\":\"Dogwei\"}")); if (jsonReader.TryReadBeginObject())
{
while (!jsonReader.TryReadEndObject())
{
var name = jsonReader.ReadPropertyName(); switch (name)
{
case "Id":
jsonReader.ReadInt32();
break;
case "Name":
jsonReader.ReadString();
break;
default:
jsonReader.SkipValue();
break;
}
}
}
} Console.WriteLine($"Swifter.Json : {stopwatch.ElapsedMilliseconds}"); Console.ReadKey();
} /**
* Output:
* Newtonsoft.Json : 759
* Swifter.Json : 161
*/
}
}
特别强调:这两种方式都是提供给有特别需求的用户,普通用户不建议使用,因为使用门槛较高,不利于维护!个人建议是定义模型,然后不管是序列化和反序列化都使用模型!这样在保证性能的情况下,使用也变得简单,易于维护。
最后附上 Swifter.Json 的开源地址:https://github.com/Dogwei/Swifter.Json 希望大家支持一下。
C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档的更多相关文章
- .NET Core和Swagger 生成 Api 文档
测试/生产环境的BUG 这里更新一下在本地调试正常,在INT/PROD上抛错,错误信息为: */**/*.xml(Swagger json file) 文件找不到,在startup 里builder ...
- .NET Core和Swagger 生成 Api 文档转
阅读目录 1.引用 2.打开startup.cs文件 3.设置XML注释 4.运行结果 5.主要问题的解决办法 6.可以自定义UI 前言 最近写了好多Web api, 老大说太乱了,要整理一下,使用S ...
- DOM生成XML文档与解析XML文档(JUNIT测试)
package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- PHP获取cookie、Token、模拟登录、抓取数据、解析生成json
本文介绍使用PHP获取cookie,获取Token.以及模拟登录.然后抓取数据.最后解析生成json的的过程. 0. 设置Cookie路径 set_time_limit(0); //使用的cookie ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- WebAPI使用多个xml文件生成帮助文档
一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...
- POI生成WORD文档
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- PHP的学习--使用PhpDocumentor 2生成API文档
官网地址:http://www.phpdoc.org/ 项目地址:https://github.com/phpDocumentor/phpDocumentor2 phpDocumentor 2是一个可 ...
随机推荐
- vb.net 带有一个参数的线程
For Each _row As DataGridViewRow In datagridview.Rows 'searchRecords_refreshRow(_row) ' 上面以前,直接运行函数, ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9
18.7 PDO的事务处理 事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作.如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所 ...
- IT兄弟连 Java语法教程 流程控制语句 分支结构语句4
4 嵌套if-else条件语句 嵌套if语句是作为另一个if或else语句的目标的if语句.嵌套if语句在程序设计中非常普遍.Java中,关于嵌套if语句需要记住的是,else语句总是和同一代码块中 ...
- 计算机组成原理——中央处理器(CPU)考研题
(一) CPU的功能和基本结构 (二) 指令执行过程 (三) 数据通路的功能和基本结构 (四) 控制器的功能和工作原理 1. 硬布线控制器2. 微程序控制器微程序.微指 ...
- 【趣学程序】Linux上安装Tengine(Nginx)
linux 安装tengine tengine是什么 tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳 ...
- 分析一个简单的WPF程序
1.新建WPF项目 使用Visual Studio 代码编辑器点击新建项目,选择 WPF应用后点击下一步: 在新窗口中我们填写项目名称.选择项目位置后点击创建就完成了WPF项目的创建. 2.WPF项目 ...
- 故事 1:.net程序员成长经历
我呢,是一名.NET程序员,在学校学的.NET和Java,在学校(校企合作)学了一年半的.NET方向的技术,后来觉得java也挺好的,又跑去学习Java,虽然学的很少,但是还是很希望能学好Java,所 ...
- Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
TimeUnit是一个时间单位枚举类,主要用于并发编程,时间单元表示给定粒度单元的时间持续时间,并提供实用程序方法来跨单元转换,以及在这些单元中执行计时和延迟操作. 1.时间单位换算 (1)支持的单位 ...
- 并发—JVM内部机制和外部机制处理方法
并发常见的编程场景,一句话概括就是,需要协调多个线程之间的协作,已保证程序按照自己原本的意愿执行.那么究竟应该如何协调多个线程? 这个问题比较宽泛,一般情况下,我们按照方式的纬度去简单区分,有以下两种 ...
- windows下dubbo-admin2.6.x之后版本的安装
安装zookeeper(单机) 下载bin.tar.gz的版本,解压 conf下的zoo_sample.cfg改zoo.cfg zoo.cfg里添加配置 dataDir=G:/zookeeper-/d ...