C#实现json压缩和格式化
json作为常用数据文件,为了传输的效率,在传输前要进行压缩,而在传输后要进行格式化,以便阅读。下面是使用C#完成的格式化和压缩代码。
public static string Compress(string json)
{
StringBuilder sb = new StringBuilder();
using (StringReader reader = new StringReader(json))
{
int ch = -;
int lastch = -;
bool isQuoteStart = false;
while ((ch = reader.Read()) > -)
{
if ((char)lastch != '\\' && (char)ch == '\"')
{
if (!isQuoteStart)
{
isQuoteStart = true;
}
else
{
isQuoteStart = false;
}
}
if (!Char.IsWhiteSpace((char)ch) || isQuoteStart)
{
sb.Append((char)ch);
}
lastch = ch;
}
}
return sb.ToString();
}
因为在json中"是用作隔离key和value的,而"又可以作为value中的一部分,所以在处理中要判断是否是单独的",还是作为隔离符号,所以要进行如上的判断。
public static string Format(string json)
{
string strCompress = Compress(json);
StringBuilder sb = new StringBuilder();
#region format using (StringReader reader = new StringReader(strCompress))
{
using (StringWriter writer = new StringWriter(sb))
{
int ch = -;
int lastch = -;
bool isQuoteStart = false;
while ((ch = reader.Read()) > -)
{
StringBuilder temp = new StringBuilder();
switch ((char)ch)
{
case '{':
if (isQuoteStart)
{
temp.Append('{');
}
else
{
temp.Append('{');
if ((char)reader.Peek() != '}')
{
temp.Append(Environment.NewLine);
}
}
break;
case '}':
if (isQuoteStart)
{
temp.Append('}');
}
else
{
if ((char)lastch != '{' && (char)lastch != '}')
{
temp.Append(Environment.NewLine);
}
temp.Append('}');
if ((char)reader.Peek() != ',')
{
temp.Append(Environment.NewLine);
}
}
break;
case '[':
if (isQuoteStart)
{
temp.Append('[');
}
else
{
temp.Append('[');
if ((char)reader.Peek() != ']')
{
temp.Append(Environment.NewLine);
}
}
break;
case ']':
if (isQuoteStart)
{
temp.Append(']');
}
else
{
if ((char)lastch != '[' && (char)lastch != ']')
{
temp.Append(Environment.NewLine);
}
temp.Append(']');
if ((char)reader.Peek() != ',' && (char)reader.Peek() != '}')
{
temp.Append(Environment.NewLine);
}
}
break;
case '\"':
if ((char)lastch != '\\')
{
if (!isQuoteStart)
{
isQuoteStart = true;
}
else
{
isQuoteStart = false;
}
}
temp.Append("\"");
break;
case ':':
if (isQuoteStart)
{
temp.Append(':');
}
else
{
temp.Append(':');
temp.Append(" ");
}
break;
case ',':
if (isQuoteStart)
{
temp.Append(',');
}
else
{
temp.Append(',');
temp.Append(Environment.NewLine);
}
break;
case ' ':
if (isQuoteStart)
{
temp.Append(" ");
}
else
{
temp.Append("");
temp.Append(Environment.NewLine);
}
break;
default:
temp.Append((char)ch);
break;
}
writer.Write(temp.ToString());
lastch = ch;
}
}
}
#endregion format #region indent
StringBuilder res = new StringBuilder();
using (StringReader reader = new StringReader(sb.ToString()))
{
using (StringWriter writer = new StringWriter(res))
{
string str = null; int nspace = ;
string space = "\t";
bool bEndMid = false;
while ((str = reader.ReadLine()) != null)
{
if (str.Length == ) continue;
if (str.EndsWith("},"))
{
nspace--;
}
StringBuilder temp = new StringBuilder();
if (!bEndMid)
{
for (int i = ; i < (str.EndsWith("],") || (str.EndsWith("}") && !str.EndsWith("{}")) || str.EndsWith("]") ? nspace - : nspace); i++)
{
temp.Append(space);
}
} temp.Append(str);
if (str.EndsWith("["))
{
writer.Write(temp);
bEndMid = true;
}
else
{
writer.WriteLine(temp);
bEndMid = false;
}
if (!(str.EndsWith("{}") || str.EndsWith("[]")))
{
if (str.StartsWith("{") || str.EndsWith("{") ||
str.EndsWith("["))
{
nspace++;
}
if (str.EndsWith("}") || str.EndsWith("]"))
{
nspace--;
}
}
}
}
}
return res.ToString();
#endregion indent
}
对"的考虑同compress,但格式化的话需要考虑到缩进,而放到一起考虑比较麻烦,所以先进行了格式化,然后在处理缩进,这样就简化了逻辑。
C#实现json压缩和格式化的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- PHP json字符串,格式化缩进显示
PHP json字符串,格式化显示 /** * 格式化 */ class JsonFormatHelper { /** * json字符串缩进显示 * @param unknown $json * @ ...
- 对Json字符串进行格式化显示
很多时候,我们拿Json字符串作为返回结果,但是当数据量多的时候,一堆的Json字符串看起来很不直观,这时候我们可以使用以下办法将Json字符串格式化一下再输出 var JsonUti = { //定 ...
- net.sf.json日期类型格式化输出
net.sf.json 日期类型格式化输出 Date, Timestamp ; 编写工具类 package cn.jorcen.commons.util; import java.text.DateF ...
- 利用Gson将JSON数据进行格式化(pretty print)
我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonPa ...
- 模拟实现JSON.stringiry 的格式化输出
前言 这是一道笔试题,要求模拟实现JSON.stringiry 的格式化输出,按照层级缩进,输出易读格式,即完成以下方法 JSON.stringify(jsObj, null, 4); // 缩进4个 ...
- JSON字符串控制台格式化输出 java
1.正常情况下返回的json数据格式如下: {"header":{"transSn":"e33128bb7622462ebfb2cbfcc46baa1 ...
- grunt配置太复杂?使用Qbuild进行文件合并、压缩、格式化等处理
上次简单介绍了下Qbuild的特点和配置,其实实现一个自动化工具并不复杂,往简单里说,无非就是筛选文件和处理文件.但Qbuild的源码也并不少,还是做了不少工作的. 1. 引入了插件机制.在Qbuil ...
- Json.net日期格式化
1. 全局设置,可以在App_Global中配置 JsonSerializerSettings setting = new JsonSerializerSettings(); JsonConvert. ...
随机推荐
- java语言基础--接口
接口定义: 是一个特殊的抽象类,在接口里面的所有方法都是抽象的. 接口用interface来声明. 注意: 接口中只能出现常量和抽象方法: 接口里面没有构造方法,无法创建接口的对象: 接口和接口之间支 ...
- Python入门 (一)
本文是个人python学习笔记,学习资料为廖雪峰python教程,如需更多内容,请移步廖老师官方网站. 一 安装 官网下载安装包安装,安装好之后,在命令提示符输入python进入Python交互模式: ...
- 关于memset赋值问题
学习借鉴自:https://blog.csdn.net/yexiaohhjk/article/details/52717934 memset是C语言头文件<string.h>中的一个函数, ...
- 2.8 break和continue
一.区别: break:终止整个循环. continue:中止一次循环,进入下一次循环. 1.1 break: public class Test14{ public static void main ...
- eclipse中的项目为什么无法添加到tomcat中?
1.右键点击项目,选择properties 2.点击Project facets 3.在右侧的Runtimes中选中apache tomcat 4.勾选Dynamic Web Module 最终改为下 ...
- CNN试验记录
CIFAR-10 图像处理:(预处理还是很重要的) 数据随机裁剪,填充0 依概率p水平翻转 1.VGG16 SGD lr=0.01 momentum 0.9 weight_decay=0.0001 e ...
- 【frame系列标签】
html框架标签1.内嵌框架 <frame></frame> 在页面上开辟一块空间 frame内部属性: src 要填充的图片或者网址 width height target= ...
- redis初步了解
redis是什么 redis是一个开源的内存数据库,拥有非常优秀的性能 如何安装redis 在linux下安装软件有几种方式:二进制文件安装和源码安装,由于redis不依赖任何外部库,所以源码安装非常 ...
- js数据三大储存格式
一.String格式 做为一个前端者 你第一手得到的数据都是字符串 二.数组格式 1.定义 var arr=[“张三”,”李四”,”王五”]; 数据通过索引去查找对应的元素 arr[3] 2. ...
- 密码疑云 (2)——RSA加密机制需要的数学知识
在公钥密码体制提出不久,人们就找到其中的三种,其中最著名的当属RSA体制.RSA是一种非对称加密体制,在公开密钥加密和电子商业中被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest) ...